The typical architecture for Windows differs from Mac since you have control of the main loop rather than the OS libraries - there is no need for a CVDisplayLink equivalent (although certainly, if the APIs were better you wouldn't need to know as much specific information to achieve this).
If you are using a loop that spins endlessly then waiting for vsync at the end of the loop is fine. If you have multiple windows you need to schedule your rendering accordingly so that your 'main update loop' ends with waiting for vsync after all rendering is submitted.
normally I have something like this:
while(!toldToQuit)
{
Render();
Update();
WaitForVsync();
}
which allows the CPU work for update (for the next frame) to happen alongside the GPU work for rendering...
SwapBuffers( HDC ) will wait for vsync if the driver has this as its default behaviour, otherwise there is a wgl extension for setting the vsync - wglSwapIntervalEXT( int ):
http://www.opengl.org/registry/specs/EXT/wgl_swap_control.txt
the way i've always achieved 'not vsyncing' is by rendering single buffered and not calling SwapBuffers... since wglSwapIntervalEXT( 0 ) does not achieve this on any hardware I have tested it on.