В этом коде элемент со случайным индексом обменивается с i-тым элементом (i меняется от this.length до 0 в цикле) по такой схеме:
C = A;
A = B;
B = C;
/*
C — промежуточная переменная
Если бы просто написали A = B, B = A, то ничего бы не вышло, подумайте почему
*/
Если текущий элемент массива — тоже массив, то для него shuffle() вызывается рекурсивно (есс-но, перемешивая и его), если в первом аргументе вызова ф-ции указано true.
Т.е.:
[1,2].shuffle(); // перемешает только сам массив
[ [1,2,3], [3,4] ].shuffle(true); // перемешает все подмассивы