O primeiro problema ( echo $f ) é devido a escapar dentro do Makefile, se você usar $f , então o make vai pensar que você está se referindo à variável make ao invés do shell e ele expandirá esse (para vazio), o que fará com que o seu shell execute um único echo com uma linha em branco para cada arquivo. A solução é escapar do $ dobrando-o, em outras palavras, use $$f , nesse caso o make consumirá um dos $ s e passará ao shell um $f , que é o que você deseja.
Com relação ao segundo problema (formato de time output), o que você está vendo é a diferença no formato de saída entre o bash time embutido e o comando externo /usr/bin/time .
make executará os comandos em seu Makefile passando-os para /bin/sh , que algumas distribuições do Linux (principalmente Debian e Ubuntu) apontam para dash , que é um shell mais simples que não implementa uma construção em time e acabaria invocando o comando externo nesse caso.
Você pode obter o bash time output dizendo ao make para executar os comandos em seu Makefile usando bash, o que você pode fazer com esta atribuição de variável em seu Makefile:
SHELL = /bin/bash