Why does STM32 use a two-stage initialization process? What is the primary purpose of each stage?
I was able to answer my own question.

The HAL_XXX_MspInit() functions are called by their respective HAL_XXX_Init() functions. As an example, when main() calls its MX_I2C_Init(), this prepares a global structure (defined in main.c) for initializing the I2C peripheral.

The call stack goes (roughly, with omissions):

main()         [written by CubeMX]
MX_I2C_Init()  [written by CubeMX]
HAL_I2C_Init() [provided by HAL Drivers and put in Drivers/ by CubeMX]
HAL_I2C_MspInit() [empty version provided by HAL Drivers, overrided by CubeMX in Core/Src/stm32fxxx_hal_msp.c ]

Note that this means that you can call the _MspInit() and _MspDeinit() functions during your code's runtime. You may choose to do this, for example, to change low-level resource state before or after a change in power modes.

This answer (and other details concerning HAL call flow) is only hinted at by the Description of HAL and LL Drivers document, and is best confirmed by checking the HAL source code. This code is quite a bit more friendly than you might expect, and is located under your project tree under HAL_Drivers for any CubeMX project.