Does it cause a context switch? I realize that this would be the "nicer" way in a multitasking environment, but it's a show stopper for games. I'd consider this function broken if it doesn't do what it's supposed to - i.e. wait for the next vertical blank.
There was a thread some years ago about this topic, it has something with sending a signal instead of direct call of XBIOS, yeah, you see, I'm really expert on this topic ;-) The point is, Vsync() isn't called immediately, it flows to kernel via some messaging system and therefore it can take longer than plain TOS.
Unfortunately Miros implementation is as clean as it can be while still being fun to use. Our OS suffers a bit from "use the VDI or you're a bad person", which in practice means there are no realistic alternatives to lubing up and going dirty.
Actually, seeing your explanation of VsetRgb() and Vsetscreen(), it narrows to only one (but very non-trivial) problem, Vsync() (Vset* or generally, any user code <-> XBIOS) latency. I remember Peter Stehlik coming with some more or less sufficient solution but it all ended in classic "who will done it" situation.