Внутреннее хранение — это оптимизация для коротких строк. Частое выделение малых блоков, во-первых, затратно по времени, во-вторых, фрагментирует память. Внутренний буфер использует через union туже память, что и параметры, обслуживающие строку. При использовании внутреннего буфера они просто не нужны, а при переходе к внешнему буферу поля переинициализируются.
Малые блоки хорошо оптимизируются алокаторами с пулами разноразмерных блоков.
И главное: ни в коем случае не надо лезть в кишки и вообще думать, что умнее компилятора. Чем проще написано, тем лучше будет оптимизировано.
При должном знании можно залезть в кишки, но не с целью использовать что-то мимо интерфейса, а чтобы сделать свой аналог. Пример:
аналог std::string, поддерживающий copy on write.