Задачка действительно простая, но я бы попытался оптимизировать память с прицелом на "sliced strings" - просто как иллюстрация, потому что объемы крошечные.
const full = '#'.repeat(7); // полная строка
for (let i = 1; i <= 7; i++){
console.log(full.substr(0, i));
}
Если верить некоторым статьям по v8, full.substr(0, i) внутри себя использует тот же строковый буфур, что и full, а не создает новый. Конкатенация тоже переиспользует, но через менее эффективную по памяти
структуру. Честно говоря, замеры не проводил )