When the code has completed, the items will show the new icon. However, opening the selected item still shows the previous form. Running the code again confirms that the message class is indeed the custom form 'IPM.Note.Print_Bcc'. This also happens for
the sub that sets the item back to the default form.

Here's the weird part. Switching from the Sent Items folder to any other mail folder, then back will trigger some action. Opening the mail item after this folder change will then show the correct custom form.

Odd thing about changing folders: It only works, guaranteed if you switch to another mail folder. I've tried switching to Calendar, Tasks and Contact sections, then selecting a folder in there and checking. Sometimes works the first time, sometimes not.
Also, it will sometimes 'refresh' if I collapse the group in the view and click around to other mail items, but it's not guaranteed.

I've also tried to manually switch from Sent Items to
Inbox then back to Sent Items in the code after the update. This does not help. I'm not sure what it causing this, but I'd rather my users not have to 'Click away and back' in order to use the change.

@Ken, setting RCW object references to null just breaks the chain between the object pointers (to the heap) and allocated memory in the heap. Therefore, the underlying COM objects stay alive. Only when the garbage collector runs "disconnected"
(set to null) objects are released.

Okay, good information Ken. So, should I target changing to a 'For' and not 'For Each' loop, Programatically swithc folders and place a counter in there before switching back, or should I try both of these items?

That relies on a MsgBox being displayed long enough for Outlook to release it's cached items.

You do need to release all possible references to anything so Outlook releases its cache as soon as possible. So compound dot operators are bad(Application.ActiveExplorer.CurrentFolder) creates an Application,
an Explorer and a Folder reference for example. Try to use a separate object variable for each object and declare loop objects outside the loop so only 1 object variable instance is created. Then set all references to Nothing. That won't clear the cache immediately,
but it will allow it to be cleared as soon as possible.

@Ken, setting RCW object references to null just breaks the chain between the object pointers (to the heap) and allocated memory in the heap. Therefore, the underlying COM objects stay alive. Only when the garbage collector runs "disconnected"
(set to null) objects are released.