There are several ways I can think of to address this situation using the Expression Builder, or even using a custom python function. Because of the size of the layer, however, these can be incredibly resource-intensive.
There is, thankfully, an easier, sneakier way, using the label settings you've already established. This will result in label text which is fixed in its position, but this can be addressed with a few extra steps. Here's how it works:
- On the Background tab, enable label backgrounds.
- Choose Marker Symbol as the background type.
- Adjust the symbology of the marker as necessary.
- Adjust symbol placement and offsets so that marker symbol is properly placed.
- You'll want to choose "offset from point" under Placement, and choose for the label to be placed directly on top of the point.
- If you're labeling the city name using the same layer, make sure that whatever offset you choose to move the text off of the point, that the inverse of that offset is applied to the background marker symbol.
- (Optional) Get dynamic label text back.
- Set the label text to a single whitespace character.
- Duplicate the layer.
- On the new layer, remove the marker symbol, and re-set the label text to the "name" field, or whichever you are using.
- Adjust the labeling properties on the new layer to get the text to your liking. You may need to change some of the labeling priority weights between the two layers.
In my map, I offset the "label" by -4. By offsetting the background marker symbol by +4, the point will render directly on top of the geometry feature.
And here are the results. I've left the actual feature layer being rendered just to show that it is highlighting the larger population points correctly. With this label setting, I can actually opt to uncheck the Enable symbol layer box on the symbology tab, and let the label points take their place entirely.
And here's the same setup at a much broader scale, with the point features no longer being rendered.