I figured out the issue.
Before returning, SetFullscreenState sends a WM_MOVE then a WM_SIZE to the event loop. I was only paying attention to the WM_SIZE, which never got called because my version of WM_MOVE blocked.
After some searching I found this:
I my header I changed the includes to this:
In the cpp:
IDesktopPlatform* fpl = FDesktopPlatformModule::Get();
fpl->OpenFileDialog(0, dialogName, defaultPath, defaultFile, fileTypes, ...