У неизменяемых объектов есть свои плюсы. Во первых, их легче сравнивать: вместо сравнения всех полей (рекурсивно) сравниваем только две корневые ссылки на объекты. Во вторых, можно расшарить некоторые внутренние структуры данных. Например, строка во многих ЯП (C#, Java, JS) - это неизменяемый объект. И в JS есть оптимизация - когда берем подстроку от строки, то используем тот же буфер данных. В случае изменяемой строки такой фокус бы не прокатил.
Разумеется, плюсы компенсируются минусами. В большом объекте долго делать изменения. Больше нагрузка на память и сборщик мусора. Так же нельзя такой объект передать куда-то и потом поменять - там, куда передали, будет устаревшая версия (это иногда хорошо, иногда плохо).
В общем, компромисы, чувство меры. Потому надо смотреть по задаче, и выбирать, какой вариант будет эффективнее и проще - изменяемый, неизменяемый, или нечто среднее.