The first file you posted works correctly so long as you use the 'Compare unique ID' condition in the sprite object itself, not just compare values. This will test every sprite instance, which is what you want.
'Compare values' has one simple job: to compare two numbers. That's it. It doesn't care what the numbers are or mean, it just compares them. In this case in order to work out each value, it doesn't know which object you want, so yes, it uses the first object. This is by design.
A second workaround is to explicitly tell Construct you want to do a 'Compare values' for every sprite instance. You can add a 'For Each object' condition above it to do this, eg:
+ For Each 'Sprite'
+ (Compare values) Sprite.UID equal to Arrow('parent')
However, this basically is a long way of writing what the Sprite's built-in 'Compare UID' condition does, so you may as well use that.