Вы путаете ссылку на строку и фактическую строку. Immutable описывает фактический строковый объект и означает, что вы не можете изменить значение этого объекта. Final ссылается на ссылку на строковый объект и означает, что вы не можете изменить строку, на которую указывает эта ссылка.
Рассмотрим следующий код:
public static String str = "happy";
...
str = "sad";
Этот код создает два строковых объекта, один из которых содержит значение "happy", а другой - значение "sad". Ни один из этих объектов (поскольку строки являются неизменяемыми) не может быть изменен. str является ссылкой и может указывать на любой из этих объектов; однако, если бы мы изменили первую строку кода на: public static final String str = "happy"; str = "sad" больше не будет законным. Поскольку мы изменили str как конечную переменную, она не может указывать на разные объекты.