I have figured it out after digging into code of haystack.
In haystack default RealTimeSignalProcessor, its connecting post_save and post_delete signals of each model of application. Now in handle_save method is being called in post_save and post_delete signal. In this method haystack is validating the sender and in my case for tags(many-to-many) field, Message_forum_tag model is being passed as sender. Now index for this model is not present into my search_index since its not my application model but instead django's generated one. And so in handle_save method it was bypassing any changes on this model and hence it wasn't updating indexed data for changed object.
So I have figured out two different solution for this problem.
I can create custom realtime signal processor specific to my model Message_forum, in this in setup method I can connect m2mchanged signal on each many-to-many fields in Message_forum with handle_save. At the same time I can pass Message_forum as sender so that haystack will pass the validation(not exactly validation but its trying to get its index obj) around it and will update the index data of changed object.
The other way is to ensure that whenever any many-to-many field is being changed, save method of its parent(here Message_forum.save()) is being called. And so it will always invoke post_save signal and after that haystack will update the index object data.
Have spend around 3 hours to figure it out. Hope this will help someone having same problem.