For some reason, the min_memory_percent of the OLTPPool and ReportPool were both 50 which seems like a typo. That must have caused the system to be starved and lead to the procedure cache not keeping/reusing plans.
CREATE RESOURCE POOL [OLTPPool] WITH(min_cpu_percent=50,
max_cpu_percent=100,
min_memory_percent=50,
max_memory_percent=100,
cap_cpu_percent=100,
AFFINITY SCHEDULER = AUTO
)
GO
CREATE RESOURCE POOL [ReportPool] WITH(min_cpu_percent=50,
max_cpu_percent=100,
min_memory_percent=50,
max_memory_percent=100,
cap_cpu_percent=100,
AFFINITY SCHEDULER = AUTO
)
GO