Note that the UVM Cookbook also recommends a virtual sequence without a virtual sequencer. This is not a coincidence. ;-)
In either case, the virtual sequence must contain handles to the sequencers on which the subsequences will run. These handles can either point directly to the agents’ sequencers (the preferred method) or they can point to handles in the virtual sequencer which are in turn connected to the agents’ sequencers.
The sequencers really aren’t being bundled at all. They remain in the agents. All that is needed is to configure the virtual sequence so that each sequencer handle points to the correct agent’s sequencer. If you want to bundle multiple agents, you can also create sequencer handles at the component layer so from outside, you only have to point to bundle.sequencer1 instead of bundle.agent1.sequencer.
In any event, the sequencer belongs to the agent. It’s recommended that you don’t lose sight of that fact.