My tendency is to encourage these sorts of requests to be markdown post-processors.
<blockquote> <p>!</p> </blockquote>
<blockquote> <p>! example</p> </blockquote>
a post-processor can simply look for
blockquote > p:first-child and test that the text begins with
! to apply spoiler markup.
The advantage to post-processors is that they can be easily configured to suit individual needs. Want to change the spoiler class? Use a config option. Want to change the wrapping code? Use a config option.