In general Windows is not a very deterministic OS, and thus being able to guarentee timing at the ms level can be quite difficult. If moving to labVIEW RT is not an option, then perhaps you can use something like the queryperformancecounter (which returns the value of the high-performance counter) to control your timing loops.
Note that with a 1.2GHz system running windows, we see jitter on the order of 10ms - so you could have two successful writes at 3.3ms each, followed by a 13.3ms pause.
However with LabVIEW RT, timing is much more accurate, and we have timing on the order of 100us.