People don't seem to be understanding the question. No one is arguing that string objects aren't immutable. The point of contention is what he bolded:
and the variable b continues to hold
"h"
I agree with the OP that this portion of the doc is incorrect on two counts:
(1) In the obvious intuitive sense that if you print(b) (or whatever the correct statement is in this language) after his two sample lines you will get "hello" as the result.
(2) In the strict sense that the variable b doesn't hold "h", "hello", or any string value. It holds a reference to a string object.
The contents of the variable b do change as a result of the assignment -- it changes from a point to string object "h" to a pointer to string object "hello".
When they say "hold" what they really mean is "points to". And they are wrong, after the assignment b no longer points to "h".
I think the example they really wanted to give is this:
string a = "h";
string b = a;
b += "ello";
The point being that a would, I believe, still point to "h"; i.e., the assignment to b doesn't modify the object it was pointing to, it creates a new object and changes b to point to it.
(I don't actually write C# but this is my understanding.)