Вам не нужны итераторы (обратные или нет) для этого. Если вам нравится код, который у вас есть прямо сейчас, и вы хотите, чтобы он работал в обратном порядке, вы можете сделать это довольно напрямую:
for (int i=layers.size()-1; i>-1; --i)
for (int j=layers[i].shapes.size()-1; j>-1; --j)
layers[i].shapes[j].dosomething();
Конечно, вы можете использовать итераторы, если хотите, но в этом случае я думаю, что это сделает код длиннее и сложнее в целом, без большого добавления:
std::vector<shape>::reverse_iterator this_shape;
std::vector<layer>::reverse_iterator this_layer;
for (this_layer = layers.rbegin(); this_layer != layers.rend(); ++this_layer)
for (this_shape = this_layer->shapes.rbegin(); this_shape != this_layer->shapes.rend(); ++this_shape)
this_shape->dosomething();