Используйте std::vector. Их можно присваивать как переменные. При этом там под капотом не будет никакого копирования, а просто изменение указателей в данном случае (так как правая часть - временное значение).
std::vector<int> a, b;
a = a0;
b = F(a);
for (int i = 1; i <= n; ++i) {
a = G(b);
b = F(a);
}
Если вас напрягает, что функции G и F выделяют память внутри, то можно сделать, чтобы они получали vector, в который надо вернуть значения:
void F(const vector<int> &a, vector<int>& res);
void G(const vector<int> &b, vector<int>& res);
std::vector<int> a, b;
a = a0;
b = F(a);
for (int i = 1; i <= n; ++i) {
G(b, a);
F(a, b);
}