I'd make this parse as "if (a) { if (b) { c; d; } }" and leave it at that. One of the reasons for significant indentation is to discourage this kind of code layout because it's hard to read.
#define RETURN_OBJECT_UNLESS_EXCEPTION(ISOLATE, RETURN_VALUE, RETURN_EMPTY) \
if (!__allocation__.IsRetry()) { \
__object__ = __allocation__.ToObjectChecked(); \
if (__object__ == (ISOLATE)->heap()->exception()) { RETURN_EMPTY; } \
RETURN_VALUE; \
} if !__allocation__.IsRetry()
__object__ = __allocation__.ToObjectChecked()
if __object__ == (ISOLATE)->heap()->exception(); RETURN_EMPTY
RETURN_VALUE
This isn't ambiguous like the example you suggested before.