Вместо того, чтобы получать категории, а затем добавлять подкатегории в цикле, используйте LINQ и получайте их за один вызов. У нас нет вашей модели, поэтому этот пример можно догадаться:
var catlist = dbContext.CategoryVM.Include("SubCategoryVM").ToList();
Это ваш код отредактирован. Вместо того чтобы получать все категории, а затем снова и снова получать все подкатегории в цикле, он получает списки из базы данных только один раз и делает остальное локально:
//Create Sub Cat List
List<CategoryVM> catlist = (List<CategoryVM>)catServices.GetAll();
List<SubCategoryVM> subCats = subCatServices.GetAll();
for (int i = 0; i < catlist.Count(); i++)
{
foreach (SubCategoryVM item in subCatById)
{
catlist[i].SubCategoryVM.AddRange(subCats.Where(x => x.Category_Id == catlist[i].Id));
}
}