If you change the code like this, it cuts the number of collision checks in half:
Also, you can add other optimization tricks. Say, perform overlapping checks every 2 or even every 3-4 ticks (instead of doing this on every tick). Because LED display is so "low-resolution" it will still look good.
I tested with 600 dots and 2 rotating Mask sprites, and with all these tweaks I'm getting comfortable 55-60 FPS on my very old Android phone.
.
Tilemap method is a bit more difficult and it also relies on overlapping checks. You loop through all tiles inside the sprite bounding box, and for each tile use "System Pick by overlapping point" event to check if the sprite is overlapping this tile. I don't know if this method will be faster or not.