I’m pretty new to this, but my understanding is that HeapBlock is used as a convenient and leak safe way of allocating memory. reinterpret_cast <float**> then changes the type of the pointer so that it handles a 2D array of floats.
First dimension is the audio channel number, second dimension is the sample index (up to buffer size). Before the reinterpret_cast you should see a bit of code which allocates the required amount of memory to satisfy these dimensions.
The memory allocation for AudioSampleBuffer has, at the beginning of the allocation, an array of float pointers, then followed by the actual sample data for each channel. The array of float pointer is what is returned from getArrayOfChannels().