I found that you can use ReplicateMovement with interpolation, but you do have to override PostNetReceiveLocationAndRotation in c++. Instead of calling Super::PostNetReceiveLocationAndRotation() in the override, I copied the code from the actor class, and then inserted the call to ProjectileMovement->MoveInterpolationTarget before it sets the actor’s location and rotation to the replicated data. This way, the actor is still in the old location when you run MoveInterpolationTarget and it can move the UpdatedComponent ahead.
That made the interpolation actually function, but I was still getting jitters. I think this is because there is nothing stopping the PMC from trying to continue with its previous projectile path in the new location set by MoveInterpolationTarget. The UpdatedComponent will snap to a new location, but since none of the projectile logic in the PMC is replicated, the velocity is unchanged, and it tries to continue along its old trajectory. My fix was to set bSimulationEnabled to false on simulated proxies, so that movement on simulated proxies is purely governed by the replicated movement from the server and interpolation.
Like @RaiderOfLostBit said, you can probably just replicate your own location and rotation and call MoveInterpolationTarget from the RepNotify if you don’t want to dive into the c++, but I thought maybe this is what Epic was thinking when they wrote the comments to MoveInterpolatedComponent().