Последняя буква не выводится потому, что во втором блоке (когда символ не совпадает) нет вывода для конца строки (if y < a ... else) как для первого случая. В результате если последний символ отличается от предпоследнего, ничего и не происходит.
Я бы лучше предложил вариант попроще: завести один счетчик (длины последовательности) и собственно переменную для символа. Напишу алгоритм, возможно будет интереснее написать самому.
# инициализируем 2 переменные, текущий символ (ключ), который группируем, и его счетчик
key = line[0]
cnt = 0
# в цикле проходим все символы строки
for x in line:
# если текущий символ совпадает с ключом, увеличиваем счетчик
# в противном случае (последовательность закончилась) печатаем наш ключ и счетчик (или вместо печати все заносим в список для вывода в самом конце)
# также после этого устанавливаем значение ключа на текущий символ (key=x) и сбрасываем счетчик на 1
# после окончания цикла еще раз выводим текущие значения ключа и счетчика (это понадобится для случая, когда последней идет последовательность символов)
Еще для данной задачи хорошо подходит функция itertools.groupby. Она группирует одинаковые последовательности, т.е. из 'aaaabbсaa' сформирует отдельные группы по 4 'a', 2 'b', 1 'c', 2 'a'. Так что это можно использовать для решения задачи:
from itertools import groupby
line = 'aaaabbcaa'
groups = [f"{k}{len(list(g))}" for k, g in groupby(line)]
print(''.join(groups))
# a4b2c1a2