Мне кажется люди путают возможность получить невалидный стейт с тем, где этот стейт хранить - в аргументах функций или в изменяемой структуре где-то в одном месте. Валидный стейт это условно энам, у него все значения - валидные.
Сам факт изменяемости плох только из-за гонок, если вы таки решите использовать ресурсы современных ПК. Поправьте, если я чего-то не понимаю.
Effective Java Item 15 Minimize mutability