All of the prepare/unprepare requests are put at the end of a queue that is processed in a separate thread, in the order they were queued. Note that this is true both for the synchronous and the asynchronous versions of AK::SoundEngine::PrepareEvent(): The only difference is whether the function waits until the request is processed or returns immediately, but either way requests are always put at the end of the queue, to make sure they are processed in the same order they were requested.
So to answer the question "What happens if you unprepare an event asynchronously and then call prepare event on it (synchronously or asynchronously) before it finishes unpreparing?" precisely: The Unprepare will be fully processed first, unloading the data related to the event, and then the Prepare will be processed, reloading the data. They will not interfere with each other since they are part of the same queue, processed in the same thread.
Note: AK::SoundEngine::LoadBank and AK::SoundEngine::UnloadBank requests are processed in the same way, and in the same queue, so you can safely make asynchronous and synchronous calls to AK::SoundEngine::LoadBank, AK::SoundEngine::UnloadBank and AK::SoundEngine::PrepareEvent and they will all be executed in the order they were queued, never interfering with each other.