Regarding determining exiting on Windows: In addition to the thread, it is also common to just add a timer and poll check once in a while. That helps avoid threads, which are notoriously difficult to debug.
So, I propose to go for the polling solution, potentially in addition to the signal handler on Unix.
You need to associate a timer to a window on Windows. You can associate with the top-level LyX window. So, in order to do that, a process manager should probably expose some polling interface, which will poll all the live spawned processes.
The LyX core would use the timer to call this polling interface once in a while.
In other words, add a process manager to expose one single point for polling.
Regarding the call-back: How common is it to copy process_data? Can't you just make that class uncopiable, and use the signals?
Regards, Asger