I had similar results when trying to read blocks of several hundred registers at a time. I ended up calculating the CRC-16 values, in plc logic, for each block of one hundered registers that I had to read. Then I made labview read all of the register blocks and CRC-16 value registers from the plc. Labview then calculated new CRC-16 values from the register blocks. I made the while loop read until the Labview CRC-16 values matched the plc CRC-16 values.
Another option may be to use the changed output from the read tag.vi, or the timestamps value and compare to previous values with a shift register.
I tend to think that the tag engine is not quite the same as working with plc logic. You just don't know how long it will take to update the tag values.