Normally this should be the operating system's responsibility, but on some old systems, the OS really doesn't do it well (Windows 95/98/ME, for example, or a phone).
If you call Thread.sleep(), the OS ought to be able to schedule other applications while yours is sleeping. You're correct that yield() would have no effect on such a system.
Windows 2000 should multitask just as well as XP -- XP is pretty much the same OS, with a prettier face. Does the W2000 machine perhaps not have enough memory to swap your applications in and out efficiently?
Presumably it's not fine grained enough. Maybe you don't want to force your thread to always wait 1 second between iterations of a loop, but you don't mind if it does because other threads are busy.
I like to think yield() should be along the lines of "sleepUntilMyNextSliceIfThereAreThreadsInReadyState". If the rest of the threads are all sleeping or pending, then yield() should more-or-less do nothing.