Part of the problem with vsync is that OpenGL and D3D handle it differently. OpenGL doesn't care, it takes the current setting you have on your 3D card, and you can optionally enable or disable it via extensions (and sometimes your driver control panel either overrides it entirely, or may even be the only way to set it). D3D not only cares, but you must specify whether vsync is to be enabled or disabled during startup. The two approaches are obviously incompatible but at the same time a default behaviour must be chosen.
Changing vsync in D3D is just a matter of changing your present parameters and resetting the device, There are also flags available for your Present call that can fine tune the behaviour a little more, but my experience is that not all drivers honour them. D3D10 and 11 are a lot more sensible in this regard (vsync is just a runtime flag rather than a startup time property).
The only reason to dynamically load all OpenGL functions is if you want to support different OpenGL DLLs. Q2 and Q3A did it for no other reason than for 3DFX support (so that the 3DFX DLL could have a different name to the main DLL - this is verified by a comment in the code). Nothing technically superior about it at all. Beyond 3DFX support it just complicates things and causes more problems than it solves.
Call logging might look on the surface like another reason for it, but these days if you wanted call logging you'd just use GLIntercept.