This optimisation already exists in FindAndReplaceDialog, where 100s of highlights are possible. When a threshold is hit, we limit search results to those that are within the viewport (or within 50px), and when the page is scrolled we recalculate.
This functionality should be brought into SelectionManager so it can be used by anyone rendering highlights, for example EditCheck in suggestion mode, which may highlight dozens of issues.