Вот метод, который я использую для пользовательского форматирования:
TimeSpan Elapsed = TimeSpan.FromSeconds(5025);
string Formatted = String.Format("{0:0}:{1:00}:{2:00}",
Math.Floor(Elapsed.TotalHours), Elapsed.Minutes, Elapsed.Seconds);
// result: "1:23:45"
Я не знаю, квалифицируется ли это как "без пользовательской логики", но оно совместимо с .NET 3.5 и не включает цикл.