onBeforeDeleteCategory not working / inconsistent
Neither onBeforeDeleteCategory nor onBeforeDeleteElements has a $performAction parameter that you can set to cancel the event, which would behavior #2 you're seeing.

The first behavior you're seeing can be explained by this, which you've already found the workaround for.  FWIW, that's changed for the upcoming Craft which, which behaves more as you'd expect now.