Your Sandwish is a struct which means when you pass it around it's copied (See structure vs class in swift language). This also means that when you pass a sandwish:
CPCell(sandwish: sandwish)
...
struct CPCell: View {
    @State var sandwish: Sandwish
    ...
}
a sandwish is copied - any changes you make on this copy will not apply to the original sandwish.
When you do $sandwish.name in CPCell you're already binding to a copy. And in the NavigationLink you're copying it again.
struct CPCell: View {
    ...
    var body: some View {
        NavigationLink(destination: SandwishDetail(sandwish: sandwish)) {
            TextField("Record", text: $sandwish.name)
        }
    }
}
So in the SandwishDetail you're already using a copy of a copy of your original sandwish.
struct SandwishDetail: View {
    @State var sandwish: Sandwish // <- this is not the same struct as in `ContentView`
    ...
}
One way is to make Sandwish a class. Another, maybe better, solution is to use @Binding.
Note that the change from @State var sandwish to @Binding is not enough. CPCell expects the sandwish parameter to be Binding<Sandwish>, so you can't just pass a struct of type Sandwish.
One of the solutions is to use an index to access a binding from the SandwishStore:
ForEach (0..<store.sandwishes.count, id:\.self) { index in
    CPCell(sandwish: self.$store.sandwishes[index])
}
...
struct CPCell: View {
    @Binding var sandwish: Sandwish
    ...
}
Also you should do the same for all other places where the compiler expects Binding<Sandwish> and you originally passed Sandwish.