bash, 78 bytes (usando um utilitário BSD) ou 79 bytes (também não BSD)
Isso é um pouco mais longo do que a @DigitalTrauma e a boa solução de 71 bytes do @ hvd, mas eu meio que gostei da idéia aqui de usar números na base 60; Estou curioso para saber se alguém pode jogar golfe um pouco mais.
Com o utilitário jot padrão BSD:
jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 86400 0|sh
Com o utilitário seq mais universalmente disponível:
seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 0 86399|sh
A idéia é gerar os números de 0 a 83699 e usar dc para convertê-los na base 60. Os "dígitos" na saída base-dc de 60 são números de 2 dígitos de 00 a 59, com espaços separando os "dígitos", portanto isso lista todos os horários desejados de 00 00 00 a 23 59 59 quase no formato necessário.
Se você literalmente fizer isso, números abaixo de 60 ^ 2 não são números de 3 dígitos na base 60, então os 00 ou 00 00 iniciais estão ausentes. Por esse motivo, estou gerando os números de 60 ^ 3 a 60 ^ 3 + 83699; isso garante que todos os números gerados tenham exatamente 4 dígitos na base 60. Tudo bem, desde que eu jogue fora o primeiro dígito extra (01) que não for necessário.
Assim, uma vez que os tempos desejados são gerados, eu pego cada quádruplo de 01 00 00 00 a 01 23 59 59, adiciono os últimos três números e subtraio o argumento $ 1. Se for 0, então pego tudo no quádruplo do terceiro caractere (jogando fora o "01"), use tr para converter espaços em dois pontos e imprima o resultado.