I guess Wire.receive can only receive one int at a time. (but sending an array all at once wasn't a problem, go figure)
You guess correctly. The sending is done in a loop, one at a time. I know, hard to believe.
Your original code was actually better, in that it only tried to receive what was actually available. The problem with it was that it stuck all the data in the 7th element of a 6 element array.
Your newer code sees that there is some data available, how much is not clear, and then attempts to read all 6 values.
byte index = 0;
while(Wire.available() > 0 && index < 6)
thisArray[index] = Wire.receive();
This code reads all available data, and stores in in the proper places in the array, checking that there is space in the array.
One question, though. Why are thisArray and lastArray different types?