A more efficient approach would be to wait on both your EventSignal and the RTL's Classes.SyncEvent at the same time, calling CheckSynchronize() only when SyncEvent is signaled (ie, when there are sync requests pending). This way, when neither condition is true, your calling thread can actually go to sleep instead of running a busy loop. For example:
uses
..., Classes, Windows;
var
Handles: array[0..1] of THandle;
begin
...
// Simulate blocking
Handles[0] := oOutLook.EventSignal.Handle;
Handles[1] := Classes.SyncEvent;
repeat
case Windows.WaitForMultipleObjects(2, @Handles[0], False, Infinite) of
WAIT_OBJECT_0: Break;
WAIT_OBJECT_0 + 1: CheckSynchronize;
else
RaiseLastOSError;
until False;
...
end;