It seems that hook_civicrm_alterCalculatedMembershipStatus is the right place for adding various actions based on Membership change. It looks like there is some issue with $membership array from the calling function.
I v'e started the hook exploration with the code below:
mail('my@email', 'title', print_r($membership, true));
and get two emails with different arrays (with 6043 part is being changed instantly):
[custom_2_6043] => [custom_4_6043] => [custom_5_6043] => [custom_7_6043] => [custom_10_6043] => [custom_11_6043] => [custom_12_6043] => [custom_94_6043] => 0 [custom_19_329] =>
[custom] => Array (  => Array (  => Array ( [id] => 6043 [value] => ... ) )  => Array (  => Array ( [id] => 6043 [value] => 0 ... ) ) ...  => Array (  => Array ( [id] => 6043 [value] => 0 ... ) )
Since we aim to perform an additional action based on a custom field value, it seems a bit tricky to catch custom field by its key without searching by field key in array or as a part of a [custom_KEY_6043] string. Besides, if there are two emails, it might mean the hook is being executed twice.
Am I taking right direction here? What would be the simpliest way of getting
if field value is X [then do Y]