There is something to be said for having full control of your environment. You can easily add and remove items from an array, why should it be different for objects?
That may be part of the reason why the delete command was added to the language. The language designers could not fathom every possible use of the JS language, so they may have opted to give the programmer more control, rather than less.
You might find their rationale in the specification, if you want to go look for it. If you want to learn more about how it works, you could read over this material:
The short synopsis is that when variables and functions are created they are given specific attributes. Some are read-only, some are not, some are deletable, and some are not. Specifically, variables and functions created in the global scope are created as not deletable. That means they get the 'dontDelete' attribute. Variables created at the function scope (like object properties) are created without the 'dontDelete' attribute - they can be deleted.
But again, while its use might be rare, not having that control would mean resorting to the active/not active booleans that you mentioned, which brings with it the possibility of the booleans getting out of sync with their associated properties. Delete also affects enumerations, looping over the properties (for x in y) where it might be desirable to add and remove properties to control the loops.
I have never used it, so I could not give a practical example, but I can appreciate the designers handing more control over to the programmers, including the responsibility of using it correctly!
I hope this helps!
LFS