TamperMonkey Script to replace the YouTube favicon with the channel logo
img.style = "position: absolute; top: -100000px; left: -100000px;";
document.body.appendChild(img);

img.parentElement.removeChild(img);



This seems weird.  The canvas can be drawn from an unattached image and these lines can be removed.


  if(url.src) url = url.src;

  img.src = url;



A more idiomatic phrasing is img.src = url.src || url.


 .querySelectorAll("link[rel *= 'icon']");



Unless you have something specific in mind, I'd use [rel='icon'] here.  It's faster, and not clear that matching an exotic future variant like &lt;link rel="BiscottiConfig"&gt; is going to be desirable.


let



Except for the final loop, every use of let in your script can be replaced by const.  It's a good habit, even if the aesthetics are inferior to let or var.


const urlRegex = /https:\/\/yt3.ggpht.com\/a[/-]{1,2}[A-Za-z\d-_]+/;

roundImageToDataUrl(JSON.stringify(window.ytInitialData).match(urlRegex)[0]).then(setFavicon);



This looks like a misstep.  Youtube avatars have id=img; why not just roundImageToDataUrl( document.getElementById("img").src )?  

Dealing with future changes to the host page is a constant challenge with userscripts.  There are many things that have to remain unchanged for this to work (the image host, the URL format, the name, content and encoding of ytInitialData) and I'll predict that some of them won't.  Selecting the avatar itself with semantic markup is likely to be less brittle, and easier to fix if the markup changes (assuming there will always be an avatar and it will always have some semantics attached to it).