WaitForMultipleObjects (been in Win32 forever) is not really related to IO completion Ports, whose API came a lot later.
My understanding is that condition variables were designed to be a superior alternative to Windows Event objects.
I'm glad to read here that others find them fiddly and overly awkward to use since that was also my impression vs the consistent and usually easy to use Windows thread synchronization HANDLE based objects. Dave Cutler definitely did a good job there IMHO.