Make sure you only call WriteUserBlock() from one of your tasks. If you were to interrupt it with another call, it's possible you could corrupt the userblock.
Also, consider updating your device to use mirrored user blocks. By doing so, the library either writes to user block A or B, ensuring that there's always a valid block available if a write fails.
I believe you can update to mirrored user blocks using this program from Dynamic C 9:
Your report is a bit confusing though, since it claims both 16K for combined blocks and 8K, which would appear to represent mirrored 8KB user blocks.
What version of Dynamic C are you using? If it isn't 9.62, can you try the userblock report program from that release?