Peel and cut potatoes into 1/2-inch cubes, then set aside in a bowl of cold water to prevent browning. Dice the 2 onions into medium pieces and chop the 3 celery stalks into 1/4-inch pieces. Peel and finely mince all garlic cloves from 1 head. Dice the ham into 1/4-inch pieces and cut the 1.25 lb bacon into bite-sized pieces. Have all ingredients measured and ready before you begin cooking.
In a large skillet over medium-high heat, cook the bacon pieces until crispy, about 8-10 minutes, stirring occasionally. Remove bacon to a paper towel-lined bowl to drain. Pour off all but about 2 tablespoons of bacon grease, then add the diced onions to the same skillet and sauté until softened and golden, about 5 minutes. Add the minced garlic and cook for another 30 seconds until fragrant. Add the diced ham and warm through for about 2 minutes, then transfer the entire mixture to a bowl and set aside.
In a large pot, add the drained potatoes, celery, 1 tbsp chicken bouillon, 1 tsp thyme, and 8 cups of water. Bring to a boil over high heat, then reduce to medium and simmer uncovered for 12-15 minutes until the potatoes are fork-tender and celery is soft. I like to taste a potato piece to ensure it's fully cooked but not falling apart—this ensures a perfect texture for the finished soup.
While the potatoes simmer, melt 4 tbsp butter in a medium saucepan over medium heat. Once melted and foaming, sprinkle in 6 tbsp flour and whisk constantly for 2-3 minutes to create a light golden roux—this cooks out the raw flour taste. Slowly add 3 cups milk while whisking continuously to prevent lumps, then pour in 16 oz cream and continue whisking until the mixture thickens, about 3-4 minutes. Season with 2 tsp salt, 2 tsp pepper, and 1/4 tsp ground nutmeg. I find that seasoning the cream sauce separately ensures the spices distribute evenly rather than settling in the pot.
Once the potatoes are tender, use a potato masher to gently smash about half of the potatoes directly in the pot—this creates a thicker, creamier texture while keeping some chunks for body. Pour the cream sauce from Step 4 into the potato mixture and stir to combine. Add the cooked bacon and meat mixture from Step 2 along with the 8 oz cubed Velveeta cheese. Stir constantly over medium heat for 3-4 minutes until the cheese is completely melted and the soup is heated through. Taste and adjust seasoning as needed, then finish with fresh chopped parsley.
Ladle the hot soup into bowls and serve immediately. Garnish with additional fresh parsley, shredded cheese, or chopped green onions if desired.