In my opinion, volatile functions in conjunction with async formulas with manual calculation mode is a lot tricky to handle. My recommendation is to use automatic calculation mode with async.
You could try one of two below
1. Cache the return value - so lets assume the user sends now() as a parameter to a formula, you should always round it to lets say a minute (after making seconds to 0) and then create the signature for async to be the value rounded to the minute and calculate the values. As now() will always get calculated but as you round it to minute, it would get cached result if recalculated before the minute completes. In the next minute the new value will calculate but subsequent calculation will return the cached value. This way you wont have a async infinite loop.
2. Create your own version of now() which are nonvolatile and refresh periodically (more granular the frequency, more times the formula will calculate) and ask user to use those as precedent to your formulas. this way you control how frequently the formula calculates by controlling how frequently your version of now calculates.
the above are just suggestions. there could be other ways to tackle the situation.
The beauty of excel is, excel decides the order of calculation when in automatic calculation mode as excel would then calculate some functions again and again if necessary to get you the latest value and try to keep all calculations to the latest with its logic of building calculation chain and optimizing the calculation chain continuously as and when new formulas get added in the excel session. Now it is becoming a problem for you as excel always thinks that your formula has a stale value because precedent was calculated and may or may not have a newer value (eg Today which calculates but only changes once every 24 hours).
What you are trying to do is build the logic of excel's calculation chain in your application, which is a bit of futile exercise as we can not take care of all scenarios (eg circular reference, named range, lambda formulas, corrupt named ranges etc) which excel is already doing for you so you may never be able to get the calculation sequence correctly (though it is in theory possible).
For me - Having calculation mode manual is last resort when in async formulas mode as you may be able to get latest value only by calling range/sheet.calculate as you store the cell references for the formulas calculated till the time they dont have #GETTING_DATA value and has a real value but it marks all volatile formulas dirty so its a slippery path that could lead to user issues (eg having stale values for some formulas.).
hope this helps and I have not confused you..