Maybe this widget could help?
You could use the listen-to widget. On the left side of your page you create a widget where you can select the categories. On the right side of the page create a listen-to widget which listens to the selected items on the right.
I would create non persistent objects for each category. So Landmarks would be one and ReviewScore another object. Then make a reference for each subcategory. So five references from Landmarks to your Search object. The search object should have all the booleans for each subcategory. This way you can retrieve very fast all DamSquare records and intersect the list with other selected categories. Use a datasource microflow that retrieves all the objects based on all the booleans in the search object. The result should be the intersected list.
Note that you have to think about how to all those objects to these categories. Is this a manual process or could this be automated. And do note that creating new (sub)categories means deploying a new version of your model.
I’ve created almost exactly what you’re looking for. See the filters sidebar at https://gridsearch2.mxapps.io/, specifically the Reference (viz) tab. This was created using my GridSearch widget:https://appstore.home.mendix.com/link/app/49364/. You can get the demo project on my GitHub repository: https://github.com/tieniber/GridSearch