When you invoke the constructor of List, its arguments are evaluated immediately (call-by-value), hence the object 3 will be stored in the List.
In general, everything in scala is an object (leaving aside JVM representation details), so what you are storing is an immutable reference to 3, which is immutable in turn.
Also, note that - due to referencial transparency (a is a constant reference to 3) - storing a reference to a or the object it references to doesn't make a difference, i.e. it's "transparent".
So, if you instead want an opaque reference to something you can change later on, you can always store a constant reference to a mutable object:
scala> class Foo(var foo: Int)
defined class Foo
scala> val x = new Foo(42)
x: Foo = Foo@3a654e77
scala> val a = List(x)
a: List[Foo] = List(Foo@3a654e77)
scala> a.head.foo
res25: Int = 42
scala> x.foo = 43
x.foo: Int = 43
scala> a.head.foo
res26: Int = 43
but boy that's evil!
As per the performance question, if a is a large immutable collection, referencial transparency allows for reusing the existing collection a when constructing b, without pessimistically copy it. Since a cannot mutate, there's no need for cloning at all.
You can easily test this in the REPL:
Let's create an immutable collection a
scala> val a = List(1, 2)
a: List[Int] = List(1, 2)
Let's use a for creating b
scala> val b = List(a, List(3, 4))
b: List[List[Int]] = List(List(1, 2), List(3, 4))
The first element of b is exactly the same a we put it
scala> b.head eq a
res18: Boolean = true
Note that eq compares reference equality, so the above is not just a copy of a. Further proof:
scala> List(1, 2) eq a
res19: Boolean = false
a. Can you please clarify the question?