Réponses:
De cette façon, printf
attend un nombre décimal à convertir en un nombre hexadécimal. Il vous suffit de convertir le caractère en nombre comme suit:
s/\([a-z]\)/\=printf("%#02x", char2nr(submatch(0)))/
Voir :help char2nr()
pour plus de détails.