Try invoking ShipMeshComponent->SetRelativeLocation( YourUpdatedRotator) instead of updating the rotator member instance directly.
I think your workaround of SetActorLocation works because it internally invokes USceneComponent::SetRelativeLocationAndRotation which actually updates both location and rotation of the mesh to reflect their latest internal values. AFAIK setting the value directly without telling the component to update itself may not work.
Check out SceneComponent.cpp in case invoking SetRelativeLocation doesn’t do the trick for you.