OK, vamos por partes 
Estamos a usar o método My.Computer.FileSystem.WriteAllText
Este método recebe os seguintes parâmetros:
1-nome do ficheiro
2-texto a ser escrito no ficheiro
3-valor lógico representando se pretende acrescentar informação ao ficheiro ou apenas substituir o que lá está. Não é muito importante.
Quando escreve a instrução "My.Computer.FileSystem.WriteAllText(SaveFileDialog1.FileName, TextBox1.Text, False)", está a dizer que:
Vai escrever no ficheiro cujo nome está guardado em "SaveFileDialog1.FileName" o conteúdo guardado em "TextBox1.Text" e que pretende escrever um ficheiro apenas com esse conteúdo (se existir um já com esse nome, o seu conteúdo antigo será eliminado).
Ora, o problema é que o método My.Computer.FileSystem.WriteAllText executa cegamente o que lhe diz. O que está a suceder é que o nome do ficheiro que lhe fornece (1º parâmetro) não tem extensão incluída, logo, o WriteAllText escreve um novo ficheiro sem extensão.
Como é que resolvemos o problema?
Tem de se certificar que quando chama a função My.Computer.FileSystem.WriteAllText que fornece o primeiro parâmetro (nome do ficheiro) já com a extensão que quer guardar (.txt).
Isto significa que pode arranjar uma String auxiliar, tornar o seu valor igual ao de SaveFileDialog1.FileName, depois altera o seu conteúdo concatenando o mesmo com ".txt", e só depois disso é que chama o método WriteAllText, passando, em vez de SaveFileDialog1.FileName, a String auxiliar que arranjou!
Percebeu agora? 
Não hesite em perguntar novamente se não tiver percebido, mas tente ser mais específico sobre o que não percebeu... 