Я также получил исключение одновременной модификации, также используя более «современный» способ сделать это:
sheet.forEach(r->sheet.remove(r));
Решение на основе итератора от @Thirupathi S, очевидно, сработало, но по причинам, которые я точно не знаю, оно создавало файлы xslx, которые не были читаемы при просмотре Apple Numbers и OSX (и, вероятно, других программ) тоже.
Я подозреваю, что это как-то связано с тем, что итератор не удаляет что-то: код метода removeRow намного сложнее, чем простая операция удаления итератора.
Использование старого простого цикла for с обратным индексом работало как шарм:
for (int i = sheet.getLastRowNum(); i >= 0; i--) {
sheet.removeRow(sheet.getRow(i));
}