Você tem os campos na ordem correta, mas sua primeira declaração de impressão adiciona uma nova linha (Output Record Separator), para que seus dados estejam lá, mas acabaram sendo quebrados inesperadamente.
A segunda questão é que você está dizendo ao printf para usar uma largura de 4; que inclui o ponto decimal e os dois dígitos depois dele, deixando apenas um para o dígito principal e nenhum para qualquer preenchimento. Tente usar 5 como a largura, para que seus dados sejam preenchidos até quatro números totais. Se você quiser 4 dígitos antes do ponto decimal, altere a largura para 7 em vez disso.
Esta é a menor mudança que fiz no seu programa para algo que gera o que eu acho que você quer:
awk -F"|" '{
format = "%05.2f,%05.2f,%05.2f";
print $1","$2","$3","$4"," sprintf(format, $5,$6,$7)}' filename
Combinei vários blocos de { }
em um e também combinei as instruções de impressão em uma.
Se eu fosse escrever sua instrução awk do zero, poderia fazer algo assim:
awk -v FS=\| -v OFS=, '{
$5=sprintf("%05.2f", $5);
$6=sprintf("%05.2f", $6);
$7=sprintf("%05.2f", $7);
print $1,$2,$3,$4,$5,$6,$7}' filename
Define explicitamente o Separador de Campos de Entrada, o Separador do Campo de Saída, converte explicitamente cada um dos campos por si próprio e imprime os campos desejados, com o OFS separando-os.