Immutable types (in any language) are special reference types. 
Their uniqueness lies in the fact that when they are changed they are replaced with an entirely new instance which reflects the previous state + the change 
Lets say 2 threads running a function which receive an immutable reference type object as a parameter ( and of course i'll use string for this example)
// pseudo code !!
  main() 
  {
      var str = "initialState";  
      new Thread(Do,str,1).Start();
      new Thread(Do,str,2).Start();
  }
  void Do(string arg,int tid)
  {
      int i = 0; 
      while(true)
      {
          arg += "running in thread " + tid + "for the " + i + "time";
          Console.WriteLine(arg);
      }
   }
This program while print in parallel the number of occurrences running in each thread with out effecting what was printed in the other thread.  
Why ? 
If you think about it string is a reference type, it is passed by reference and not by value, meaning it is not copied only a copy of the reference occurs.
And yet though it was initially the same object. after the first change it is no longer and a different one is created. 
If it was still the same object after changes it would be a shared resource between the 2 threads and will disrupt the state those threads men't to print.