Не берите в голову, что я нашел способ оптимизировать это, я оставлю здесь ответ для других людей, ищущих то же самое.
Вместо:
var rows = ['<tr><td>row 1</td></tr>','<tr><td>row 2</td></tr>','<tr><td>row 3</td></tr>' ...];
$.each(rows,function(i,row){
if(row){
oTable.row.add($(row)).draw();
}
});
Я сделал это:
var rows = ['<tr><td>row 1</td></tr>','<tr><td>row 2</td></tr>','<tr><td>row 3</td></tr>' ...];
$.each(rows,function(i,row){
if(row){
oTable.row.add($(row));
}
});
oTable.draw();
Другими словами, вместо перерисовки таблицы при каждой вставке строки я сначала добавил все строки, а затем обновил таблицу в конце цикла.