Never, never, never use the RELEASE statement unless you are 100% positive what it does. The RELEASE statement does not affect the transaction in any way. It actually writes the changes on the buffer back to the database "in a dirty way" - dirty because the transaction is not committed yet and others who fetch the same record with NO-LOCK will see this although it still could be undone when the transaction is rolled back. Usage of the RELEASE statement is - IMHO of course - in almost all cases bad practice. Instead one deliberately should work with buffer and transaction scope.
Why is there no difference between the two FOR EACH? The simple answer is transaction scope. In both cases the transaction scope is the same. In the first case the transaction scope is extended to the next outer block with transaction scope capabilities, which is the FOR EACH block. In the second case you supply the TRANSACTION key word - which is meaningless - as the transaction is already scoped to the FOR EACH block anyway. In any of these two cases, as it is an iterating block, the transaction scope is a single iteration. If you want all iterations to be part of one large transaction, you must deliberately extend the transaction scope in surrounding the FOR EACH block with another block which has the TRANSACTION keyword.
Concerning the AI ( after image): The AI is a log of all transaction committed since the last backup. That means transaction scope itself only indirectly affects the size of the AI log. Less large transaction cause less transaction header markers whereas more small transactions cause more transaction header markers in the AI. Usually the changes in the data use much more space in the AI log, but YMMV ...
Heavy Regards, RealHeavyDude.