Place onion, garlic, ginger, and serrano chiles on a small baking sheet and broil, rotating until charred, about 8 minutes. Remove from broiler and add cinnamon, star anise, coriander, cloves, peppercorns, fennel, and cardamom. Return to broiler until spices are toasted and aromatic, about 30 seconds to a minute more. Transfer to crock pot, along with beef shanks and chicken stock. Add salt or fish sauce, and enough water to cover shanks by ½-inch, about 8 cups.
Place lid on crock pot and let cook, at least 8 hours and up to 12 for an even fuller flavor, until meat is falling off the bone.
Remove beef from crockpot. With a spider or mesh strainer, remove all aromatics from the pot. With a large spoon, skim fat. When beef is cool enough to handle, shred into bite-sized pieces and return to broth. For best results, chill broth and skim fat; reheat before serving. Alternatively, skim fat while soup is warm with a large spoon. Season to taste with salt or fish sauce.
Divide broth and meat among serving bowls and top with noodles, bean sprouts, lime wedges, herbs, scallions, and chiles. Serve.