Your poor DS, sounds like he's had a very rocky start with his eating and tummy. (And poor you, too!)
It sounds as if his early growth could have been pushed back a bit dew to his vomiting and perhaps poor digestion due to his intolerances. Any chronic period of being unwell can prevent a child from building up energy reserves and laying down new tissue.
This would be a simplish answer although I do think he needs a bit more investigation, it sounds like you've been fobbed off a bit? His hormone levels and iron levels etc need to be checked even if they were a few years ago as things can change very quickly with those, especially in children.
If it does turn out to just be delayed growth, he will almost certainly be able to catch up (as would a premature baby) with the right nutrition and help.
The fact that he can't eat butter isn't as much of a worry as it might seem! He can get lots of healthy fat from fish oils and vegetable oils such as olive... avacado is also pretty high in calories and fat for a fruit, does he like that?
Ideas for boosting calories and nutrients(sorry if I list anything he can't have)...
Breakfast: Use breads made with wheatgerm and seeds if he can have them, veg oil stirred into porridge or weetabix, cream if he'll take it in milk, bananas, yoghurt or soy yoghurt, dried fruits such as figs, apricots (good for iron and calcium!)
Lunches: ham and avacado sarnies, drizzle of oil in sandwiches, hummous on oatcakes, milkshakes
Dinners: stir in a tbs of two of cream or oil in to his portion - it doesn't affect the taste at all. Fruit juice with his meal.
Serve a pudding often, fruit crumbles and custard are quite healthy and high energy!
Snacks: ham and oatcakes, hummus and veggies, oat biscuits, bit of chocolate now and then 
Sorry if they are no good or you already do them! I have to have a high calories diet for health reasons and use these things to up my intake easily whilst not having to eat loads of junk! x