Вы не спрашиваете: «Почему они не окончательные», вы спрашиваете: «Почему они не включены». Просто конечный результат заключается в том, как вы комментируете компилятор, что вы хотите, чтобы они были встроены.
Причина, по которой они не являются автоматически встроенными, - это отдельная компиляция.
object A { final val x = 55 }
object B { def f = A.x }
Когда вы компилируете это, Bf возвращает 55, буквально:
public int f();
0: bipush 55
2: ireturn
Это означает, что если вы перекомпилируете A, B не обратит внимания на изменение. Если x не отмечен окончательным в A, B.f выглядит следующим образом:
0: getstatic #19 // Field A$.MODULE$:LA$;
3: invokevirtual #22 // Method A$.x:()I
6: ireturn
Кроме того, чтобы исправить один из других ответов, final не означает неизменяемость в scala.