Wire.read() returns an int, which is why it works.
Good find on the return value of Wire.read().
I still think that even if a byte were returned by Wire.read() the bitshift combination would work because of the arithmetic operator promotion with the bitshift <<8 on the byte.
byte return_x2(byte a)
{
byte b = a * 2;
return b;
}
void setup() {
Serial.begin(9600);
int c = return_x2(1) << 8 | return_x2(1);
Serial.print(c);
}
void loop() {}