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