Well, prior to Grails 3.1 services were transactional by default, as of Grails 3.1 they are only transactional if the @Transactional annotation is applied.
If you are on a transactional service when an exception is triggered the transaction will be marked to do rollback. At the same time when a transaction is rolled back the Hibernate session used by GORM is cleared.
I am assuming your service is being marked with @Transactional. That is why your domain is not being saved. To get around the behavior above described you could mark your service as @NotTransactional. That will provide you with more control over your service method, just be aware it won't be transactional anymore. And the GORM session will not be cleared after the exception is thrown.
EDIT:
Because you're calling .save(), it is highly recommended to do it inside a transaction. You could then use the withTransaction(Closure) method.