What might the RenderThread be waiting for?

That looks very much like waiting for visibility queries, which likely are waiting on z buffer rasterization and reading back the fragments-pass query results.
(Would be my guess, without actually reading the code.)

Now, that may mean that visibility queries is your bottleneck, but it may also just mean that some other rendering mechanism is your bottleneck, and the visibility queries are being backed up behind that.
OR it may mean that VSync is on and you’re actually just waiting on each frame being presented.

You’ll need to vary the standard things (vsync, window size, turn off texturing, …) to see where the bottleneck might lie.

Also, read the code for VetchVisibilityForOther and trace it through, to get more of an understanding for what’s going on, if the standard “change the window to very small” delta measurements don’t work.