V první řadě nemáš na začátku řádku mezery pro "centrování" - na místě mě napadá hned několik možností řešení (například druhá proměnná s mezerami, mezery i tečky/H v jedné proměnné a záměna znaků...).
Za druhé, v části "while" vypisuješ PŘED zvětšením řetězce - po skončení smyčky je řetězec o " H" delší, než se vypíše - z toho vychází to, že následující řádek je stejně dlouhý.
Pokud jde o samotné zkracování znaků, tam si nejsem úplně jistý, čím to je, ale předpokládám problém ve znaku ukončujícím řetězec. Každopádně {a:2} korektně zkracuje při každém průchodu (a ne při každém druhém, jak máš ty).
Poznámka: Určitě se nauč rekurzivní funkce, ale nespoléhej na ně vždy - uvědom si, že pro každé takové volání se musí vytvořit "podshell", zkopírovat data na zásobník... Lepší je převést problém rekurze na iteraci (tedy za předpokladu, že to jde v rozumném čase a nepovede to k přílišnému zvětšení nároků).