1. Сокет у Вас создается с флагом WSA_FLAG_OVERLAPPED? ( если Вы используете вызов socket, то флаг установлен )
2. Данные читаются с помощью WSARecv, куда передается 6ым параметром пустая структура OVERLAPPED и эта структура остается валидной до окончания операции? Если эта структура используется многократно, ее нужно обновлять ( обнулять ) перед каждым использованием.
3. Вы учитываете, что операция чтения может быть выполнена синхронно?
4. Мне честно говоря немного смущает вот это:
(LPDWORD)&pSocket, &pOverlapped
Если p — это префикс указателя, то разыменование указателя в данном случае IMHO не уместно?