If the problem is not shown from U-Boot but only from WinCE, probably WindowCE uses different partition start/end values for NVRAM.
When you reset NVRAM from U-Boot and store all variables from U-Boot and you don't get any such failure messages during next U-Boot reboot but you get them in WindowsCE, how does this match your sentence "nvram.lib can read the values saved in NVRAM", because your error message says that you shouldn't be able to read them, because the deteced CRC checksums are wrong.
The partition table in WinCE with start/end addresses, are these compiled or dynamically, read from NVRAM (for NVRAM they should be static) or taken from WinCE registry?
Do you have connected external devices to the data/addressbus which might concurrently try to access the adddress/databus while WinCE tries to read NVRAM from flash? Maybe a problem with the chip select signals of those devices or electrical interference (Emission input) on those chip select signals?
Does the problem occur on all of your devices or just one/some?
What does U-Boot command "nand bad" show?
Are there any bad block in the NVRAM partitions?
which are maybe skipped correctly by U-Boot but not by WinCE nvram.lib?