Preheat oven to 350F.
Pat the beef shanks very dry with paper towel. Using a sharp knife or kitchen shears, cut three slits in the membrane around the edge of each shank - this will help prevent the shanks from curling as they cook. Generously season both sides with salt.
Heat a large saute pan or Dutch oven over medium-high heat for 5 minutes. Add the olive oil and heat until shimmering. Add the beef shanks and cook, undisturbed, until browned, around 6 minutes. Flip and cook the other side until browned, around 6 minutes. Transfer to a bowl and set aside.
Lower the heat to medium and add the carrot, celery and onion. Season with a pinch of salt and cook, stirring occasional, until the vegetables have slightly softened, around 8 minutes. Add the garlic and cook, stirring, 60 seconds. Add the tomato paste and cook, stirring to incorporate, 2 minutes.
Add the chicken broth and use a wooden spatula to lift any brown bits off the bottom of the pan. Add the thyme, bay leaves and black pepper. Season with a pinch of salt and stir to combine. Nestle the browned beef shanks in the sauce, bring the liquid to a steady simmer, cover with a lid and transfer to the oven. Cook for 2 hours or until the meat is very tender and falling off the bone.
Transfer the beef shanks to a serving platter and use a ladle to remove any grease in the sauce. Taste the sauce for seasoning and adjust with salt and pepper as desired. Spoon the sauce over the osso buco and serve with the polenta and gremolata.