ls é aliased por padrão como: ls --color=auto , então quando ls está em um terminal que suporta cores, ele usa códigos de cores.
Uma chamada de system() não acontece em uma sessão bash para que seus aliases não sejam avaliados. Eu também não tenho certeza do que aconteceria com a detecção automática, então eu faria com que fosse forçada a saída de cores, ligando o comando:
system("ls --color=always -l -d */");
Eu testei isso e funciona. --color=auto também funcionou e isso pode ser mais seguro.
Esse fenômeno pode acontecer mesmo sem estar em uma chamada C system() . Eu já passei por um problema semelhante com watch com outra pessoa . Execute watch ls -l e você não verá cores. Há também uma explicação sobre por que --colour=auto nem sempre funciona.