Если уж уходить в оптимизацию, то тогда объектный пул и перебор всех этих пуль (те, что активны) в массиве (т.е. один единственный скрипт, который их двигает, в нем List с трансформом и данными, вроде скорости).
Наверное имелось в виду автоматической загрузки. Не вижу в этом ничего плохого, может это и увеличит на несколько миллисекунд экран загрузки в игре, но избавит от потенциальных дублей, null полей и прочих битых ссылок в Dictionary/Hashmap.
Если так уж хочется хранить именно ссылки - то можно создать ScriptableObject контейнер для целевых и хранить все там, а на сцене держать только ссылку на него.
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
Трансформ префаба игнорируется, если тебе нужен поворот, то задавай его при спавне, либо делай систему родитель-ребенок и в ребенке уже задавай повороты, родитель же будет всегда брать позицию и поворот, переданную в функции выше, либо дефолтные нулевые, если ничего не передано.