If you wanna see the exact calcs, see this Bulbapedia article
But basically you missed two key factors of calculating a Pokémons stats: IVs (Individual Values) and EVs (Effort Values)
IVs
Individual values are the Pokémon equivalent of genes. They are instrumental in determining the stats of a Pokémon, being responsible for the large variation in stats among untrained Pokémon of the same species. Each of the six stats has an IV associated with it, with that IV coming into calculation alongside the Pokémon's base stats, Nature, and EVs to determine the actual stat number. A Pokémon's IVs are fixed when it is generated by the game and cannot be changed (although Hyper Training causes stats to become values corresponding the maximum IVs). Source
In short, these are values, ranging from 0-31, that are randomy chosen for each stat when the Pokémon is generated. Your Vileplume may have a lower SpA IV than your Typhlosion, for example.
EVs
Effort values, or EVs, are values that contribute to an individual Pokémon's stats in the core and side series Pokémon games. They are primarily obtained by defeating Pokémon in battle, based on the Pokémon that was defeated. Due to effort values, trained Pokémon are usually stronger than wild Pokémon, even those of the same level. Source
Basically every time a mon gain exp in a battle, it also gains EVs for a particular stat, and what stat gains those EV's depend on the Pokémon that was defeated (Rattata gives Speed, Abra Gives SpA, etc.). Your Vileplume may have less SpA EVs than your Typhlosion, for example.
Another thing you forgot...
VIleplume only has 110 Base SpA from Gen 6 onwards. It had 100 base SpA before that, meaning that in HGSS, it actually had lower base SpA than Typhlosion, but it was still possible that it could have a lower SpA stat than it if its IVs and/or Evs were lower
Hope I helped :)