The problem is a numbers game. The windows CDC driver continuously polls the IN endpoint. Have you got data? - reply = NAK. This happens over and over and any available USB bandwidth is consumed with all these short fast transactions that are just a few microseconds.
Should there be a period of noise on the bus some of the transactions may get corrupted. Normally this is not a big issue as in USB there are built in CRCs and retries etc. But with CDC all these transactions are short and fast and therefore it becomes far more likely that the noise may span over three consecutive transactions. It is the noise over the consecutive transactions that causes the host to basically give up on the endpoint. (Actually, this is due to the sloppy software from microsoft that does not avail itself of inbuilt USB requests to the endpoint (SET FEATURE, GET FEATURE, CLEAR FEATURE) that are there to provide a mechanism to recover "bombed" endpoints...)
So to write that in short form - it is the lack of data being sent (therefore many short IN transactions) that causes far greater probability of three strikes and your out.
On windows this happens completely and totally silently. There is no error message (indeed the port may not even be owned by an end application to report to.) The end result is that there is still a comport that is marked as "working" and the comport will send data out and all control transfers will complete normally. In fact everything accept the data IN endpoint is working and nothing has happened to alert the CDC device, the PC side driver (usb.sys) and nothing past up the chain to any user app.
On top of this there are problems with the way windows handles the opening and closing of the USB handle. If the comport is claimed by a user app windows will not reconnect with the CDC device if it is reset only at the device end. You have to reset the connection at both ends to recover. The PC side app must close the comport then the CDC device must be reset externally.
This is the downside to not having to write any code to control the CDC USB class. You don't get any control when it would be an advantage to have it.
This problem is quite well known to those of us who write firmware for USB and one of the reasons why the windows implementation of CDC is mourned for being partly ruined.
As this is a numbers game (probability) it is of course possible for someone who has a robust, low noise connection to never see it occur. It is also why someone may see it several times one day and not again for a week or more.
I am sure that there are far better explanations on the web for this issue than what I have posted here. I have seen it discussed on the microchip forum and the keil / ARM forum too. Hopefully I have explained enough to give you the basic idea of the problem and why you may not have seen it yourself. (Half your bloody luck!)