If I enqueue an instance of a Queueable class during a before trigger, is it guaranteed that the Queueable class will not run until the after trigger completes?
Yes, this is guaranteed (though not explicitly documented). The reason why is that, until the transaction fully commits, the Queueable job call may be rolled back, either because of governor limits, an sObject addError call, a Database.rollback command, or an uncaught exception, and probably a few other ways. As such, the system absolutely will not execute the Queueable until the transaction that spawned the trigger context has successfully run its course. This is also true for Scheduled jobs, Batchable jobs, future methods, sending emails, calculating sharing rows, and almost any other type of asynchronous code or action that may exist in the future. The two exceptions to this guarantee are the "DML Immedate" actions available on External Objects, and the EventBus.publish actions that can be called on Platform Events that execute immediately.
(Note to future readers: if future exceptions to this guarantee arise, please let me know.)