Cygwin = lets put unix on windows, use as much native unix stuff as possible
MingW = lets keep unix out of windows as much as possible, us as much native windows stuff as possible.
Cygwin is usually a little bit slower because it adds a couple of extra layers, where as mingw is generally pretty good about doing the bare minimum of stuff.
As for the "bunch of Microsoft specific libraries of VCC.", you only use those libraries if you want to. The microsoft Visual C++ compiler is pretty good about Ansi standards, thus most code that compiles with Mingw compiles with microsofts compiler without many issues.
As nothing man said, if you want a linux environment (GNU libc stuff) then you probably should just do a linux VM. I've done some pretty intense programming and dealt with some pretty low level code, honestly, either compiler is going to do everything you need it to do, I doubt that you will ever run into a huge life altering difference between the two (so long as you don't do GNU/microsoft specific code.)
When you run into specific problems is when you start to try playing with OS specific stuff (playing sound, making windows, ect). There is NO ansi C++ standard for OS interaction (well, threading is going to be part of the standard here soon, but that's a bit off topic). Truth be told, I actually prefer a lot of the win32 API OS calls over the GNU calls. Try making a window with raw XLib code vs using the Win32 code, the difference is huge (And that is the correct comparison, mentioning the GTK or QT is not a direct comparison.) Win32 code, while slightly opaque, is miles easier to write then xlib code.