As a test I've added some toggles to run the framework back on the main thread.
So much more stuff runs.
Of note, in wclMessaging.cpp a call to ProcessMessages()) on line 221 is hit, followed by the next breakpoint in wclBluetooth.cpp at line 1137 DoDiscoveringStart().
With the process in a separate thread this never takes place. Specifically _WndProc() is never called, although I have verified that _WndProc()'s window handle is still created/registered.
I've verified that calls made via the framework are taking place on its new thread (via a TQueue and an FRunnable in UE4) and are being correctly consumed.
Only other thing that stood out for me is the call stack when it's not threaded:
Is it possible that UE needs to "pump" the framework in order for its messaging thread to continue to run? I'm unsure why it's present in the callstack at all.
What is stopping the framework from receiving messages when it's not on the main game thread?