I think I have figured it out. I am no expert, hence the solution that I am suggesting must be considered with appropriate caution.
Icon.Assign(Bitmap) almost always involves creation an icon (or some associated object) on the fly. If you do this often enough, the application will have noticeable leaks. Icon.Assign(Icon) apparently does not have that problem.
In my case, instead of having an array of TBGRABitmaps, I changed it to an array of TIcons. Then for each TIcon, started with creating TBGRABitmap, drew on it and finally assigned it to the TIcon. It is this icon which is then assigned ot the tray, form or application icons. No observable leak after this.