Strings are immutable objects. This means that for each modification a new string is created.
Consider this code:
Dim s As String = "1000 characters long string..."
s = s & "."
In the second line a new string is created with a size of 1001 characters. The 1000 characters from the previous string are copied to the new string and a dot is added as the last character.
This happens on each iteration. For short strings the overhead is negligible, however for longer strings it becomes huge.
StringBuilder on the other hand is a mutable string.
It maintains an internal buffer and grows it as needed (with enough room for many more characters).
So appending a character is a very quick operation. It just copies the character to the internal buffer.