You could try this approach, but with the following caveats:-
- it will be slower than using a point pattern fill
- it can't be rescaled if you zoom in/out - the grid pattern will be in map units
- you'll probably need to do this on a CRS in meters.
You could make a vector grid (of polygon type) with an appropriate size (say, 100m x 100m spacing) depending on the symbol spacing you want and the scale you want to print at. You could also consider using MMQGIS Plugin > Create Grid which also allows hexagonal grids... this will allow an 'offset' look where every other row of dots is shifted slightly.
Next, do a spatial join (join attributes by location) with the original polygon - the one you wish to fill - so that you only keep those squares which intersect your original polygon. That should give you a grid of square cells which slightly overlaps your original area.
Now, render this grid as 'centroid fill'. Centroid markers should all show completely, although it's possible some centroids will be OUTSIDE of your fill polygon. But it should fix the problem you have here with small interior holes clipping your symbols.
An alternative is to use a finer point spacing on your pattern fill, and smaller symbols.