I will fill out a detailed report when I'm back home. It's strange because M25 works for a played file and it's executed in the same switch statement as M600 (in Player.cpp).
Perhaps it's the ten cycles of the main loop before the suspend part 2 is called that's causing the problem in this case? I'll also try doing something silly like a bunch of duplicate blank G0 commands, since the panel screen module is also registered for the main loop event it might be passing things to the dispatcher and robot still. It doesn't appear to check with anyone if execution of its own command queue is supposed to be suspended.
But, I'm not going to pretend to grok the code, so I have no idea what will actually work. I just suspect the issue is arising from playing the file on the SD card from the GLCD, so I'll also try playing the test file in a couple different ways.