Вы можете получить сначала заполненный столбец, а затем отфильтровать массивы.
var csvData = [["", "2", "", ""], ["", "3", "", ""], ["", "", "4", ""]],
columns = csvData.reduce(
(r, a) => (a.forEach((v, i) => r[i] = r[i] || v), r),
[]
);
csvData = csvData.map(a => a.filter((_, i) => columns[i]));
console.log(csvData);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Для удаления только последних пустых столбцов вы можете получить максимальное значение заполненных столбцов и удалить остальные.
var csvData = [["", "2", "", ""], ["", "3", "", ""], ["", "", "4", ""]],
max = csvData.reduce(
(r, a) => (a.forEach((v, i) => v && (r = Math.max(r, i))), r),
0
);
csvData = csvData.map(a => a.slice(0, max + 1));
console.log(csvData);
.as-console-wrapper { max-height: 100% !important; top: 0; }