I answered my own question here, though the question I asked was really badly written in retrospect. I just wanted to keep the speed of the player up while turning, and have turning steer towards the input direction on the joystick rather than lerp towards it and slide.
Keeping speed up while running:
Instead of what I was doing before, which was moving the player towards a lerped version of the velocity, I tracked speed as a separate variable. From there, I lerped the speed and simply multiplied the direction vector by that speed amount:
# Lerp run_speed
run_speed = lerp(run_speed, max_run_speed * step, accel * delta)
# Apply run_speed to direction, creating velocity
velocity = direction * run_speed
step
is just the input strength of the controller, being a number between 0 and 1. If your game is designed just for keyboard use, you can leave it out.
This makes the player's speed stay high while turning and go down over time if there is no input, but the turning is still instant with no "steering" effect.
Achieving velocity steering:
All I had to do for this was track the direction of the player as another separate variable and have that lerp towards the input direction with the extra variable turn_speed
:
# Steer the real direction towards the mapped direction
direction = direction.linear_interpolate(input_direction, turn_speed * delta)
direction = direction.normalized()
This does create a problem where the player won't turn immediately if the input is too sharp, such as holding W to holding S, but that can be solved later by using a "turn around" animation where the player skids to a halt and resumed in the other direction. That or maybe someone else can come up with a better method than mine here.