As for [initbang] - my only use has been for making abstractions that can spawn a variable number of inlets/outlets. That's the only way I've used it and the only way I've ever seen it used-- if there are other uses maybe someone else on this list can give an example.
The [initbang] object gives abstractions the ability to do something that otherwise would only be possible by coding an external in another programming language. For example, with [initbang] I can quickly make an abstraction that can act like Max/MSP's [trigger] object-- where you can specify numeric values as arguments ( like [trigger b 0] ).
In other words, you want Pd to include "meta" capabilities enough that abstractions have all the functionality of coded objects. [initbang] would be one step in this direction, but there would be at least these other requirements:
1) The ability, in vanilla, to dynamically delete individual instantiated objects without "dynamic mousing."
2) Left [inlet~] that can take messages like [bang( or [stop( and pass them.
3) [inlet~] that can output a settable constant signal upon creation (imagine if you wanted to create [tabosc4~] as an abstraction using a [phasor~] and a [tabread4~] -- there isn't currently a good way to connect the [inlet~] to the phasor and also have a default frequency creation arg).
4) In some cases, access to name of the parent patch could be helpful.
Matt