Updating a Slate brush would generally be done via a delegate. Slate widgets can take arguments in the form of SLATE_ARGUMENT, or SLATE_ATTRIBUTE; an attribute can be optionally bound to a delegate to allow you to dynamically change the value at runtime, eg)
SNew(SImage).Image(this, &MyWidget::GetMyBrush)
If you want to populate a slot via a for loop, you can use SAssignNew to assign the thing with the slots (eg, SHorizontalBox) to a variable, and then use AddSlot(…) on that variable rather than using the Slate declarative syntax directly.