Очевидно, что если у вас есть выбор, вам не нужно точное значение i и j во время цикла.
Таким образом, второй вариант лучше, более читабелен (меньше отступов). Небольшая оптимизация, которую вы могли бы выполнить (чтобы не выполнять умножение на каждой итерации цикла):
int iKMax = max_i*max_j;
for (int k = 0; k < iKMax ; ++k)
{
// second way - one loop
}
И всегда используйте префиксный оператор в циклах (++ k), потому что независимо от того, какой объект повторяется, он экономит одно копирование этого объекта. (См. Херб Саттер и Андрей Александреску, «Стандарты кодирования C ++: 101 правила, руководящие указания и передовой опыт»)