You simplify to much. In Risc OS, the main application gives control to an other application when it calls Wimp_Poll, correct. But, like you wrote, interupts can happen and guess what they are used for: I/O. You don't write to a serial port, you write to a serial port buffer. You don't read from a serial port, you read from a serial port buffer. If there's nothing there what do you do. You wait, but I give control to Wimp_Poll and check again when it returns.
The difference is, you write your programs in an other way. You don't use blocking calls.