Make flax/chia egg: Mix together ground flax/chia seed and water. Set aside to gel while you prepare the meatball filling.
Finely chop veggies: Add garlic, mushrooms, and walnuts to a food processor and pulse a few times until finely chopped. Transfer to a bowl. Add onions to food processor and pulse a few times to finely chop. Be careful not to chop the veggies too finely that they start to get mushy - you want small pieces so they add texture.
Cook onions: Heat olive oil in a skillet over medium heat. Add onions and a pinch of salt and cook, stirring frequently until lightly browned, 3-5 minutes.
Cook mushrooms: Add pulsed mushrooms, walnuts, garlic, and a pinch of salt. Cook, stirring frequently, until mushrooms have softened, about 3 minutes. Remove from heat and transfer the veggies to a large mixing bowl. Let the veggies cool while you prepare the rest of the meatball filling.
Make oat flour: Add oats to food processor and process until oats resemble a grainy flour.
Add tofu: Squeeze excess water out of thawed tofu.Tear tofu into chunks and add to food processor. Process until tofu is broken up into small crumbles.
Pulse in remaining ingredients: Add remaining ingredients to food processor and pulse a few times until well combined.
Mix with veggies: Transfer the mixture in the food processor to the bowl with the veggies. Mix until well combined.
Chill: Cover the bowl and rest in the fridge for 1 hour.
Preheat: If baking in the oven, preheat oven to 400°F/205°C while you shape the meatballs.
Shape meatballs: Scoop about 2 tbsp of mixture and roll into a ball. Place on a parchment paper-lined baking sheet or in your air fryer basket. Repeat with remaining mixture - I ended up with 28 meatballs. You can lightly spray them with cooking oil for a crispier texture.
Bake: Bake at 400°F/205°C in the middle rack of the oven for 20 minutes, then flip and bake another 5-10 minutes until golden brown.
Air fry: Place in air fryer basket and try not to let them touch (you will probably need to cook them in batches). Cook at 375°F/190°C for 15-20 minutes until golden brown.
Coat with sauce: Add all sauce ingredients to a pan and bring to a simmer over medium low heat. Stir constantly and simmer 1-3 minutes until slightly thickened. Add meatballs and stir until well coated.
Serve: Meatballs will soak up the sauce the longer they sit, so serve immediately after coating with the sauce. If you plan on having leftovers, keep the sauce and meatballs separate.
Freezing & reheating leftovers: You can freeze the uncoated, cooked meatballs and sauce in separate freezer bags. To reheat, you can bake, air fry, or pan fry the meatballs (thaw overnight in the fridge to speed up the reheating time). Thaw the sauce in a pan, then add meatballs to coat.
Notes
Mushrooms: If you can't find shiitake mushrooms, cremini mushrooms are a good alternative. White button mushrooms should work too, but cremini and shiitake have more flavor.