Когда вы пишите
int *nums = new int[5];
вы не удаляете переменную а создаете. Чтобы удалить массив надо будет потом написать что-то типа
delete []nums;
Когда вы выполняете new то получаете указатель на блок памяти а когда вы потом вызываете delete для удаления, этот указатель становится недействительным. Если, как вы пишите
2) Почему бы это не делать для каждого массива и потом удалять его?
то после создания ссылки (которая под капотом тот же самый указатель) а потом освобождения занимаемой памяти, на которую она ссылается, вы получите очень опасную ситуацию, когда ваша ссылка становится недействительной. Это очень плохо и хорошо, если программа при этом просто вылетит. Но возможна ситуация, когда у вас начнут втихаря портится данные, а вы поймете это только существенно позже.
Что касается вопроса
то я смогу заполнить 6-ую ячейку массива?
Смотрите: когда вы выделяете кусок памяти, вы, фактически, получаете указатель. Си считает, что вы разумный человек и не полезете за границу выделенного блока, но контроль этого лежит на вас. С одной стороны это хорошо, а с другой плохо. При этом в самом языке изначально НЕТ механизмов, которые бы запрещали вам обращаться куда угодно. Учитывая потенциальную опасность подобных действий, большая часть языков, появившихся после Си, пытались как-то обезопасить работу с памятью и устраивали гонения на указатели, дабы хоть как-то оградить нерадивых программистов от самих себя.