в этом и вопрос, если не выходить из обработчика то уже не нужно разрешать прерывание (1<<TWIE), но в программе оно всё равно разрешается, хотя и так уже разрешено (при TWINT=1),
Ну разрешено и разрешено, когда выйдет - тогда и будет важно разрешено или нет, а до выхода - без разницы, avr не поддерживает вложенных прерываний (за исключением классов приоритета в более старших мегах). Т.е. до выхода из прерывания их можно что разрешать, что запрещать - сколько угодно, важно что останется после выхода.
Может надёжнее этот цикл убрать, или так тоже надёжно?
Без разницы, на надёжность это не влияет, лишь на скорость.
Из минусов: на это время тормозится обработка всех других прерываний (и основного цикла), т.е. увеличивается лаг срабатываний того же таймера. Не частота, а именно лаг реакции на метку времени. В данном случае это пофиг, всё равно пока I2C не освободилась новую транзакцию начинать нельзя (хотя проверки что i2c свободна (например TWIE==0) у вас в таймере и нет!), но в других случаях полезно помнить.
если добавить default: и в нём поставить stop i2c, то это решит проблему? При любых неправильных статусах шина будет останавливаться и всё. Или это не решение?
Это хорошее решение. Но не полное - если на шине глюк или есть другой мастер или завис девайс на шине, то может не получиться выдать стоп - могут не дать поднять SDA. Некоторые такие ситуации (довольно большая часть от всех) лечатся ожиданием внешнего стопа (от другого мастера или отпусканием шины от девайса), некоторые не лечатся вообще никак кроме снятия питания.