Transaction.atomic with continuations
I don't think there's anything wrong with the should_send_email version of the code. But I can see that in more complex cases there would be a readability benefit in keeping the after-commit logic next to the condition.
There's no documentation. How do I use the AtomicWithContinuation class? What methods does it have? What guarantees does it provide about which callbacks will be called, when, and in what order?
The name could be improved: callbacks are not the same as continuations.
It would make sense for the after_commit and after_rollback methods to take *args and **kwargs to be passed to the callback:

def after_commit(self, cb, *args, **kwargs):
    """Call cb, passing *args and **kwargs, when this transction commits."""
    self._after_commit.append((cb, args, kwargs))


That would allow you to omit the lambda:

a.after_commit(send_email, result)

There's repeated code for calling all the callbacks in a list. This could be made into a function:

def run_callbacks(callbacks):
    """Run the callbacks in the iterable."""
    for cb, args, kwargs in callbacks:
        cb(*args, **kwargs)

You ask, "can I trust my assumptions in __exit__?" Well, there seem to be three assumptions:


If atomic.__exit__ is called with exc_val=None, it commits the transaction.
If atomic.__exit__ is called with any other value of exc_val, it rolls back the transaction.
If atomic.__exit__ raises an exception, then the transaction was rolled back.


Assumptions 1 and 2 are guaranteed by the docstring for the Atomic class, which says:


  __exit__ commits the transaction or releases the savepoint on normal exit, and rolls back the transaction or to the savepoint on exceptions.


It would be worth adding a comment to your __exit__ method quoting or linking to this guarantee.

Assumption 3 is not guaranteed anywhere I can find, and a look at the source for the Atomic.__exit__ method shows that it tries to roll back the transaction, but this might fail, possibly ending up with the connection being closed, or the needs_rollback flag being set.