The WinAPI docs say:
"The system clock "ticks" at a constant rate. If dwMilliseconds is less than the resolution of the system clock, the thread may sleep for less than the specified length of time. If dwMilliseconds is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on."
1ms might just be under 1 tick. Previous answers suggested std::this_thread::sleep_for, but those are even more inaccurate as your application might yield its CPU time for other applications, and it is on the scheduler to give CPU time for your application again.
You could busy sleep, which means having a loop that constantly checks if enough time has elapsed, but this can be heavy on a computer if done improperly, but some games actually do that.