This is not safe according to rust aliasing rules. If mutable reference exists, then no other reference can exist. Here both mutable and immutable reference exists at same time. Although in different thread.
You can wrap every ship with arc mutex,then put arc in vector. Then clone the vector and send to thread.
Gamedev in pure rust generally uses some ecs library to manage resources due to these kind of problems.
I see that you are using unsafe keyword here. If you want to ignore rust safety and want to manually ensure safety in unsafe block, cast references to pointer and make shoot fn accept pointers. Then you can write c like code with pointers and everything that comes with it.