Boa explicação isso só mostra que a ia está precisa aprender um pouco mais kkkk
Eu fiz esse video explicando esse conceito de uma forma mais lúdica.
Quanto jogar uma string na pilha, é possível dentro do heap, você pode ir alocando vários elementos e caso o elemento precise ficar mais tempo vivo você pode usar lifetimes.
Sobre não ser eficiente acho que é um equivoco, pois da pra fazer aplicações com uma boa eficiencia mesmo não tendo esse gerenciamento de memória manual. Tanto que o próprio Java e C# possuem boa eficiencia apesar do garbage collector.