РЕДАКТИРОВАТЬ: Этот подход не гарантированно работает, так как на идентичность элемента (т.е. адрес) нельзя полагаться при параллельном выполнении.
Правильное решение - связать диапазон итератора с диапазоном индексов., как показано в ответе Калет.
Вы можете использовать арифметику указателей:
int* beg = vec.data();
std::for_each(std::execution::par, vec.begin(), vec.end(),
[beg](int& elem) {
elem = &elem - beg;
});
Очевидно, это работает только для контейнеров, которые хранят элементы непрерывно.