s=[2] лишнее, на двойку и так уже всё проверено, достаточно 
s=[].
В последнем 
if занимательно смотреть на дублирование одинакового кода в обеих ветвях.
Зачем 
sum и 
sum_s до меня по прежнему не доходит.
Вместо 
len(s) я бы завёл ещё переменную равную 
len(s) в каждый момент времени и сравнивал с ней. Может быть выигрыш во времени. Увеличить её легко вместе с 
s.append.
Формально условие 
n<a неправильное, надо 
n<=a, как раньше и было, это будет важно для простых величин 
a (вдруг захотите в будущем посчитать не до 2 миллионов).
Разве допустимо выражение 
s[-1]? А оно у вас в строке 
n%s[i-1] обязательно будет, и не один раз. Да и 
s[0] лично мне под вопросом, не знаю с чего (0 или 1) нумеруются списки в питоне.
Ну и плюс неправильное условие остановки в самом конце, из-за чего и сумма неправильная. Эта же причина и в предыдущем коде была.
PS. Проверять правильность кода можно для 
a=10, уже тут будет ошибка суммы, а время экономится. 
