Rewriting your speed transition formula as
float blend = clamp((currentTime - startTime)/transitionDuration), 0, 1);
Vector3 currentVelocity = startVelocity + (endVelocity - startVelocity) * blend;
Then during the transition we're applying a constant acceleration of:
Vector3 acceleration = (endVelocity - startVelocity) / transitionDuration;
Now we can integrate this to get the total displacement from the starting position at time T=0 in three parts.
First, for currentTime <= startTime
,
Vector3 currentPosition= startPosition + startVelocity * currentTime;
Which at the end of this interval reaches a value of:
Vector3 accelerationStartPosition = startPosition + startVelocity * startTime;
Second, for startTime < currentTime <= startTime + transitionDuration
, we can use the formula for position under constant acceleration:
$$\vec p(\Delta t) = \vec p_0 + \vec v_0 \cdot \Delta t + \frac 1 2 \vec a \cdot \Delta t^2$$
in code:
float transitionTime = currentTime - startTime;
currentPosition = accelerationStartPosition
+ startVelocity * transitionTime
+ 0.5f * acceleration * transitionTime*transitionTime;
Which we can simplify to:
currentPosition = startPosition + startVelocity * currentTime
+ 0.5f * acceleration * transitionTime*transitionTime;
Which again, at the end of the transition interval, takes a value of:
float endTime = startTime + transitionDuration;
Vector3 transitionEndPosition = startPosition
+ startVelocity * endTime
+ 0.5f * acceleration * transitionDuration*transitionDuration;
And lastly, for currentTime > startTime + transitionDuration
:
currentPosition = transitionEndPosition + endVelocity * (currentTime - endTime);