SOLVED!
I don't know what was wrong with the old code. My guess is that the NPC respawn code uses NPC location data loaded at initialization, so the NPC was respawning at the same location even though its location in the database was being changed correctly.
What I did was: I replaced the code for the HandleNpcMoveCommand on CreatureCommand.cpp with one call for HandleNpcAddCommand and one call for HandleNpcDeleteCommand. I also modified HandleNpcAddCommand to add a copy of the NPC you're targeting in case you don't provide an input argument. This way a copy of the NPC gets added, then the old NPC gets deleted. It's not as clean OR as efficient, but since you're not going to be using this command a lot it really just works
This is my code:
https://pastebin.com/ZHAw128S
Just realized there's still some debug lines there anyway, I hope this helps anyone who's having a problem with this command as I was having. EasyBuild really makes it easy to test stuff like this.