What is the loop logic of I2C driver in EFR32LG14
The result holds the resulting status of trying an operation. Therefore it tells you if starting the transfer started OK or failed due to some error or is it still in progress and this kind of items. So it does not return you the data as a result, and that is why you must give the function a place where to receive data. Returning the data would not not work at all, since you might request tens of kilobytes of data, and you can return a single variable basically.
And the loop simply waits until the transaction started earlier is complete, as transfer is performed behind the scenes using interrupts (or DMA), so you need to wait when transaction is done before you can start another transaction or read the transferred data.
Another option is that interrupts/DMA are not used, so the I2C peripheral needs to be constantly handled by polling to make it perform the correct sequences for performing the transaction until it is done.
I bet the manual or reading the source code would reveal how it works.