Polskie znaki tak na prawdę są dwoma bajtami. Wyświetlane są jednak jako jeden znak. Stąd rozbieżność.
Do tego trzeba by użyć klasy stringa rozumiejącego kodowanie (tutaj zapewne UTF8). String z C++ to niewiele więcej niż dynamiczna tablica znaków (bajtów).
Musisz albo poszukać jakiejś biblioteki (z gotowych jest np. QString z Qt), albo napisać własną klasę radzącą sobie z polskimi znakami i współpracującą z cout.
Ostatecznie możesz nie używać width i napisać sobie funkcję
string funkcja( string s, int n );
dodającą spacje przed wejściowym stringiem, tak aby wyjściowa długość wyniosła n (oczywiście z uwzględnieniem polskich znaków zajmujących dwie pozycje).