After all of these months, I finally found the solution, and it’s really dead simple:
When you attach a Character (with a Character Movement Component on it) to another actor and want them to stay put, you need to set CharacterMovementComponent -> bIgnoreClientMovementErrorChecksAndCorrection
to True. This is accessible both in C++ and in Blueprints (get the movement component, drag off of it, and create a Set Ignore Client Movement Error Checks And Correction node).
Well, that was a journey!