the overlay is to be presented in (overlay->pts - OMXMediaTime) seconds. So instead of waiting for this to be zero or negative, like you do now, you add that time to current systemclock and tell renderer to flip at that timestamp.

Psuevdo code:
time = GetAbsoluteTime()
pts  = OMXMediaTime + 100ms
ProcessOverlays(pts);
FlipPage(pts + time);

That way. Rendermanager have the overlays that is to be visible at 100ms from now, ready and queued up. 

That 100ms can be anything. It just should be something larger than 0 (0 is what your code does now) so it get's a head start and prepares.