I found that the combination of the two just worked. renv hooks into the REPL by creating a .Rprofile file in your working directory. RCall reads that .Rprofile when you first run using RCall, so renv gets activated as expected. You can run commands like renv::status() and renv::install() through the dollar-sign shell mode or by running R command strings like R"renv::status()". And if it doesn’t get activated for some reason, you can run the activation script manually with source("renv/activate.R").
Here’s what my workflow looked like:
# start julia in workdir with julia --project=.
julia> import Pkg; Pkg.add("RCall")
julia> using RCall
# $ activates R repl mode
R> renv::init()
R> renv::install('tidyverse')
R> library(tidyr)
# have at it
# upon restarting the julia repl, `using RCall` will activate renv again