List<Int> сообщает потребителю, какие операции доступны через эту ссылку. Он не обещает, что сама коллекция останется неизменной.
Допустим, вызывающий код создаёт val owned = mutableListOf(2, 4) и передаёт его функции, принимающей List<Int>. Позже вызывающий код добавляет 6 в owned. Если потребитель сохранил тот же объект, интерфейс только для чтения не создал снимок прежнего состояния. val фиксирует ссылку в owned, а не содержимое списка.
Для функции, которой нужны значения на момент передачи, я бы указал, где создаётся отдельная копия и кто защищает её от дальнейших изменений. Если функция намеренно читает текущее содержимое списка вызывающего кода, общего объекта может быть достаточно. Где вы создавали бы снимок, если требуется именно он?