I came up with a slightly different partial solution that I felt like sharing.

Character rotating at low speed

Character rotating at higher speed
Character rotating and moving at high speed
The green lines are showing the line between the sockets.
The red lines are computed.
FVector curBase = GetMesh()->GetSocketLocation(FName("StaffBottomSocket")), curTip = GetMesh()->GetSocketLocation(FName("StaffTopSocket"));
const int sub = 32;
float curLength = (curBase - curTip).Size();
float prevLength = (prevBase - prevTip).Size();
for (int i = 1; i < sub; i++)
{
FVector tmpBase = FMath::Lerp(curBase, prevBase, i / float(sub));
FVector tmpTip = FMath::Lerp(curTip, prevTip, i / float(sub));
FVector tmpOff = (tmpTip - tmpBase);
tmpOff.Normalize();
DrawDebugLine(GetWorld(), tmpBase, tmpBase + tmpOff*FMath::Lerp(curLength, prevLength, i / float(sub)), FColor::Red, false, 1 / 15.0f * 2);
}
prevBase = curBase;
prevTip = curTip;
DrawDebugLine(GetWorld(), curBase, curTip, FColor::Green, false, 1 / 15.0f *2);
The code is rather simple and lerps between current and previous socket location.
The interesting part here is that it tries to keep the length of the line consistent by normalizing it and then scale by the expected length.
(The length of the line should in fact be constant, but this is for making it more general)
It is not a perfect solution but I thought it was good enough to share.
