You have to be a bit careful, but can make it work. See for example How to overwrite built-in functions? - #2 by janekfleper
This is also a recursive show rule, but it works. The trick is checking whether the show rule is triggered by itself and just return it in that case. In your example, it would probably need to read if it.body == box(image("assets/link icon.jpg", height: 0.8em)) or something like that.
I think it’s cleaner here to have a single link, so ideally combine this with Y.D.X’s solution. Then the body consists of the original body and the new body; you’ll need something like if it.body.func() == [].func() and it.body.children.last() == ... (body is a sequence ending in the image). When writing this code, it’s super useful to temporarily add repr(it.body) to your show rule to see exactly what you’re trying to match.