Thanks Joe.
After a lot of digging around, I found that we had put some custom code in the profile.ascx.vb file, that was breaking this functionality for some reason. The scenario was: We had a custom profile property, whose value decided whether to add a user to a particular role. To make sure the user is added to/removed from appropriate roles whenever the user updates his profile, we needed to know what the old value of that property was. Now, in the cmdUpdate_click event, when we inspect the profile properties, they already have the new values - even before a call to
ProfileController.UpdateUserProfile(User, properties)
So, we put some code in the Page_Load event to store the initial profile values. When we removed the code from the Page_Load event, everything works fine.