Place bacon in a large saucepan over medium heat; cook until golden but not crispy, about 5 minutes. Add asparagus and onion; cook, stirring frequently, until onion is translucent and asparagus is tender, about 7 minutes. Pour in chicken broth; bring to a boil. Reduce heat and simmer soup, covered, about 10 minutes. Remove from heat.
Melt butter in another saucepan over medium heat. Whisk in flour to form a paste, about 1 minute. Gradually add milk, whisking constantly, until smooth. Cook over medium heat until thickened, about 5 minutes.
Puree soup in batches in a food processor or blender until smooth. Return to the saucepan. Stir in thickened milk mixture until incorporated. Season with salt and pepper to taste.