There is basically no smart solution to your problem, for the time frame for shout is from 00 :00 to 23 :59, and is strictly a HHMM on 4 chars (no day type delay)
1°) There is a possibility, available since version 630 and called Time Synonyms, and which can extend the time frame from 00:00 to virtually 49:59. This is based on the actual new day time and does not apply to your case, for your newday time is 00:00.
2°) Another solution would be to order jobs C and D one day after job B, and use PREV in the condition dates. In that situation, SHOUT WHEN LATE 0900 would work for C and D, but ..
This is another problem if your jobs are not daily jobs, since PREV does not consider the ODATE of the predecessor, but the date of the current job .
To overcome that new problem, you should change the condition date in C and D definitions to B_C_OK **** and B_D_OK ****, and do not forget to delete these conditions in the OUT of C and D.
An inconvenient of this implementation is that you lose the ODATE consistency between your 4 jobs.
3°) Another solution is to create another job to check at 09:00 whether D or C are still in Wait status for any reason, and send the actual SHOUT if one of these 2 are still waiting. This job would be ordered one calendar day after A, B, C and D, and it should do something like.
ctmpsm -listall | egrep (C | D) | grep Wait | grep <ODAT> | wc -l
If the result is 0, that means that C nor D are not in Wait status anymore
If the result is 1 or 2, that means that C or D or both are still in Wait status.
The <ODAT> value matches the ODAT of C or D, and can be obtained in the script of the new job by something like:
ctmstvar 0 "%%$CALCDATE %%$ODATE -1".
The advantage of this solution is that you maintain the date consistency of you ABCD chain.
The inconvenient is that the control is made external to the chain