For good change management, you really need both methods suggested here, and more.
We have deeply nested BOMs, up to 8 levels deep, with thousands of components.
When you revise a component, you need to make a copy of the product with a revision identifier. Where this revised product is used in an assembly, you set an end date for the previous revision, and a start date for the new revision.
If the revised component is a subassembly, then you also need to make a copy of the BOM for that revised subassembly. A custom module, doing all of this at once, would be convenient.