I’ve discovered a very simple bug in the implementation of FMX menu loops on Windows. This bug leads to what is in effect an Application.ProcessMessages loop in VCL terms, causing a CPU spike for the duration an FMX menu is shown. To fix, copy both FMX.Platform.Win.pas and FMX.Defines.inc to your project’s directory, open up the former, and work your way to line 1515 in TPlatformWin.StartMenuLoop. Then, replace
if not FirstLoop then WaitMessage;
if FirstLoop then FirstLoop := False else WaitMessage;
Rebuild, and the spike should be gone.