The NMI is an interrupt, meaning that when vblank starts, the CPU stops whatever it's doing and jumps to the NMI handler. If the code that's interrupted is working with VRAM, and the NMI handler also works with VRAM or uses registers that affect the VRAM address, the address will be incorrect when the NMI ends and the code that was running before resumes, so the following VRAM writes will certainly go to the wrong place.
I've never had code conflict in this manner.
These kinds of conflicts happen all the time. When you code an interrupt routine, you always have to think of the impact it can have on the rest of the program as it runs. We normally use flags to indicate what the NMI and IRQ handlers can or can't do depending on what's happening in the main program, to avoid these situations.