How to get list of blocks for region on current page?
There's a block.repository service with a getVisibleBlocksPerRegion() method. You can either use that or look at what it's doing.

This will cover access checks as well but not empty blocks.

This is however quite a bit of an overhead as all blocks are loaded and access checked twice. There is an issue to add caching there.

Alternatively, you can use preprocess of the region templates I guess.