I believe the problem is because you are treating integers like strings.
03 is not a valid integer so it gets converted to 3.
The rest of the convertions from int to varchar and back is the server helping you out a lot.
However, with what you have you can get to the final value you are looking for.
This should work...
print cast(@left as varchar(4)) + replicate('0', 2-len(@right)) + cast(@right as varchar(2))