I didn't consider that we could simply pass the pointers around to construct what I wanted without needing to consume the iterator multiple times.
Create three vectors to store the references.
let mut As = Vec::new();
let mut Bs = Vec::new();
let mut Cs = Vec::new();
states.iter_mut().for_each(|(state)| match state {
State::A(a) => As.push(a),
State::B(b) => Bs.push(b),
State::C(c) => Cs.push(c),
})