This seems to have occurred due to the configuration descriptor not being constructed correctly. It seems as though the descriptor was good enough to get past the "device unrecognised" stage, but incorrect enough to not be able to proceed. Once I set up the configuration descriptor correctly, I haven't had this issue.
Using Windows ETW for USB along with Wireshark helped me confirm this problem, as I could see what was being transferred and received correctly, giving me confidence in tracking down the problem.