String é mutável pq pode ser concatenada com outra string, mantendo o mesmo nome da variável. O método Substring, sem uma operação de atribuição é que não faz nada com a string, mas se vc marcar um código assim:
string teste = "exemplo";
string teste = teste.Substring(4);
Console.Writeline(teste);
A saida será: plo, portanto alterou a string !!