I would like a more abstract approach.
In KiCad, the schematic symbol is the part while to me it is more logical to have the part as an empty container to which links to schematic symbol graphics and footprints can be added in the same way as other meta data.
There is also the idea of a “design block”. One implementation of this lets a schematic symbol to either be connected to a footprint (for example an castellated breakout board), or have the same schematic symbol point to a hierarchical sheet with a schematic of whatever is on that breakout board. (For example an IC, some decoupling caps and other passives). Such a design block would even have it’s own PCB layout, so changing from using the breakout board for prototyping to using the parts of the breakout board would just be a few mouseclicks. These design blocks can also easily be used to re-use partial layouts from other KiCad projects, such as for example an SMPS circuit with all needed parts.
There is also work being done on adding some kind of database driven workflow to KiCad. Especially bigger companies have house-built databases with approved parts. The idea is that you select fully specified parts (including footprint, and ordering information and more). It would be quite silly to add all this information to the schematic symbols in KiCad. It would explode the duplication of graphics for resistors for each of those parts. I do not know how this is going to be handled.
What you can do in the mean time is to add your parts to the schematic, and then use the Exclude from board checkbox in the schematic symbol properties, but it’s quite an ugly hack.
Another option is to add a “lens assembly” schematic symbol, and then have that replaced with actual BOM parts by some backend script, or modify a BOM script itself to replace the “Lens Assembly” by the actual parts.