why is this one needed in order to receive the data?
It isn't. But, it IS needed to complete the transaction where you tell the device what kind of data it is to send.
What does it do?
The beginTransmission() method allocates a buffer, and makes sure that it is empty. The write() method call(s) put data in the buffer. The endTransmission() method sends the data in the buffer to the device at the specified address. This is all documented on the Wire library page.
If I remove the false and allow it to send a stop command instead no data will be received.
Whether the value in the endTransmission() call needs to be true or false depends on what you are talking to. Some chips need to have the I2C bus released before they can send data on the bus. Others don't.
Sometimes, you want to send data to multiple devices without the other devices on the bus trying to send replies. Sometimes, you don't.
The endTransmission() argument lets you have complete control of the bus.