We don't know what your MinutesTODuration function does - it's not a standard SQL function, so you need to start looking at that.
However, when I use a TIME variable, I get what I expect:
DECLARE @st TIME(0) = '02:07'
SELECT @st AS TIME
Gives:
TIME
02:07:00
As does
DECLARE @st TIME(0) = '2:7'
SELECT @st AS TIME
So you need to look at what you are doing with your presentation layer that is formatting the TIME value.
[EDIT]
OK, so you showed us your function - which doesn't return a TIME, it returns a string ... which you specifically fill with non-leading-zero values ...
Assuming you use SQL 2012 or later:
SET @hours =
CASE WHEN @minutes >= 60 THEN
(SELECT FORMAT(@minutes / 60, 'd2') +
CASE WHEN (@minutes % 60) > 0 THEN
':' + FORMAT(@minutes % 60, 'd2')
END)
ELSE
FORMAT(@minutes % 60, 'd2')
END
If you use an earlier version then the FORMAT needs to be replaced with:
SELECT RIGHT('00' + CAST(@minutes / 60 AS NVARCHAR(5)), 2)
And similar for the remainder.
[/EDIT]