As a clarification to your question: the requests are not synchronous, but serial.
Unlike Queries, which the GraphQL Specification leaves open to "allowing parallelization", mutations MUST run in a series.
(Links to Query and Mutation spec
6.2.1 Query
...
- Let data be the result of running ExecuteSelectionSet(selectionSet, queryType, initialValue, variableValues) normally (allowing parallelization).
6.2.2 Mutation
...
- Let data be the result of running ExecuteSelectionSet(selectionSet, mutationType, initialValue, variableValues) serially.
The pattern that is widely adopted is that your mutation should "return when it's done, and wait until it has that data". Theoretically, however, you could make your mutation kick off some event and just respond saying it had. You could then use a Subscription to identify when the response was ready. Again, this isn't really "the way GraphQL is generally used", but theoretically, you could.