Мне кажется люди путают возможность получить невалидный стейт с тем, где этот стейт хранить - в аргументах функций или в изменяемой структуре где-то в одном месте. Валидный стейт это условно энам, у него все значения - валидные.
Сам факт изменяемости плох только из-за гонок, если вы таки решите использовать ресурсы современных ПК. Поправьте, если я чего-то не понимаю.
Ну вот пишешь ты метод. В начале метода достаёшь из этого изменяемого стейта, например, одно из полей. работаешь с ним. Теперь тебе нужно ещё одно поле. Лезешь за ним в изменяемый стейт и работаешь с полученным значением. А на выходе получаешь проблемы, потому что какая-то из подпроцедур изменила состояние, к которому ты обращался. Заметь, ты в однопоточной среде, никаких гонок