I've figured out why.
My original MPC_LAND_SPEED and MPC_Z_VEL_MAX_DN were 0.6 and 0.5 respectively.
Thanks to the following chunk of code from MulticopterLandDetector.cpp, descend_vel_sp will never be true.
if (_flag_control_climb_rate_enabled) {
vehicle_local_position_setpoint_s vehicle_local_position_setpoint;
if (_vehicle_local_position_setpoint_sub.update(&vehicle_local_position_setpoint)) {
// setpoints can briefly be NAN to signal resets, TODO: fix in multicopter position controller
const bool descend_vel_sp = PX4_ISFINITE(vehicle_local_position_setpoint.vz)
&& (vehicle_local_position_setpoint.vz >= land_speed_threshold);
Had to increase MPC_Z_VEL_MAX_DN and that solved my problem