Simulation study in R with two variables and 10000 iterations
Possible Bug

If I understand what you are trying to do correctly, the lines...

DVcontrol &lt;- rnorm(iter, mean=0, sd=1)
DVexperiment &lt;- rnorm(iter, mean=ES, sd=1)


...should probably be 

DVcontrol &lt;- rnorm(SS, mean=0, sd=1)
DVexperiment &lt;- rnorm(SS, mean=ES, sd=1)


This was noted in the comments by @flodel.

Identifying slow steps

The best way to figure out what lines of the code are slowest is to use a line profiling tool.  I like profvis.  In general, the slow steps in R are element-wise assignment to vectors/matrices/data.frames, and unvectorized functions.  In your case, 

p.rep[i] &lt;- t.test(DVdiff, alternative="greater")$p.value
d.rep[i] &lt;- mean(DVdiff) / sd(DVdiff)


are likely to be slow. And the t.test() function in R is unvectorized as also a bottleneck.

Possible solutions

Vectorization of assignments

I'm a big fan of the tidyverse system of packages.  For this case, the tidyr, purrr, and dplyr system of packages allows a very nice functional implementation of your problem.  However, they won't automatically vectorize functions like t.test().

Vectorization of t.test()

Googling around, it appears there are a few vectorized implementations of t.test().  One I found easy to use is from the genefilter package, colttest().  And although it isn't as much of a bottleneck, I also used a vectorized computation of d by using the colSds() and colMeans() functions from matrixStats.

Putting it together

Below I implement some of what your original code does.  I didn't worry about the particular flavor of t-test that you were using (i.e. alternative = "greater"), and I didn't implement computing the correlation between p.values.

require(tidyverse)
require(purrr)
require(genefilter)
require(matrixStats)

N_ITER &lt;- 10000
effect_size_range &lt;- seq(0, 2, 0.5)
sample_size_range &lt;- seq(10, 1000, 100)
test_or_repeat &lt;- c('test', 'rep')

input &lt;-
    expand.grid(effect_size_range, sample_size_range, test_or_repeat)
names(input) &lt;- c('ES', 'SS', 'test_or_rep')

output &lt;- 
    input %&gt;%
    group_by(ES, SS) %&gt;%
    mutate(ctrl = map(SS, ~rnorm(.x * N_ITER)),
           expt = map2(SS, ES, ~rnorm(.x * N_ITER, mean=.y)),
           diff = map2(expt, ctrl, ~ .x - .y),
           diff.matrix = map(diff, ~matrix(., nrow=N_ITER)),
           p = map(diff.matrix,  ~colttests(., gl(1, nrow(.)))$p.value),
           d = map(diff.matrix, ~colMeans(.)/colSds(.)),
           mean.p = map(p, ~mean(.)),
           mean.d = map(d, ~mean(.))
          ) %&gt;%
    select(ES, SS, test_or_rep, mean.p, mean.d) %&gt;%
    unite(p_and_d, mean.p, mean.d, sep='___') %&gt;%
    spread(test_or_rep, p_and_d) %&gt;%
    separate(test, c('p.test', 'd.test'), sep='___') %&gt;%
    separate(rep, c('p.rep', 'd.rep'), sep='___')


This run, which covers about 1/5th of the effect sizes and 1/10th of the sample sizes you are interested in, takes about 5 minutes to run on my laptop.  Since it uses N_ITER = 10000, I think scaling up to your full system size would take about 50 times this number, or about 4 hours.  The bottlenecks here are still the t-tests, but also simply calling rnorm, a sign that we got rid of the assignment-by-element bottlenecks and reduced the t-test bottlneck at least somewhat.