In Vue-land, no need to have {{ }} when it's inside an attribute. Instead, you can preced the attribute with a : to tell Vue "there is code in here, go run it".
So another way to write this, which is a little more Vue would be:
<template>
<img :src="msg.payload?.icon" alt="img-alt">
</template>
Note I also included ? on the .payload as it then handles the case where msg.payload doesn't yet exist, by checking it exists before trying to read .icon (generally on first load)
The ${} syntax used by @hotNipi is a general JavaScript notation, and can be used, for example, if you want to merge strings with a dynamic variable:
<template>
<img :src="`${msg.payload?.icon}.png`" alt="img-alt">
</template>
Where here, it would auto-append .png to anything read from .icon