A thread can only be run on one core at one time. For an application to run on more than one core simultaneously, it must be multi threaded.
Killermike has suggested giving each application its own OS context, and I have pointed out that this is a technique used in Unix systems (back in the mainframe era). It would require some rewriting of the OS and extension modules, but would it really need to be so extensive?
Rjek has rightly pointed out that a switch statement with a long list of case statements is less efficient than a jump table for handling the Wimp_Poll reason codes, but I have already agreed that any saving would be insignificant in itself.
The Wimp_Poll idea was to allow applications to respond to more than one event at a time, in a multiprocessor system. Wimp_Poll itself would become redundant because the OS would never return from it. Instead, it would call the event handlers in the jump table. I realise that you'd lose compatibility, but I don't think it would require an extensive rewrite of application code because the only effect is to change the way you get to an event handler. The advantage, in a multiprocessor system would be that an application could carry out background tasks, (responding to Null events) while simultaneously doing, say, a window redraw and, say, a task to task data transfer. Of course, if you go down that route, you might as well make it possible to register unique instances of handlers for different objects.
Having said all that, I have also suggested that you could take advantage of multi-cores by starting a new task to handle background activities (such a rasterising a print, or saving a file to memory) and that Simtec's Hydra software should be re-examined.
My intention is only to offer suggestions for porting RO to new hardware with limited redesign resources, and if my understanding of processors is stuck back in the main frame era, then modern processors should be more than capable of handling those suggestions.