Из-за чего, когда я конвертирую байты в строку и обратно, то байты отличаются?
В первом примере вы не конвертируете байты в строку и обратно. Вы конвертируете байты в их хекс-коды, а потом еще раз конвертируете результат в хекс-коды. Логично, что у вас не получается одинаковой строки, ибо вы два раза кодируете и ни одного раза не декодируете.
Если вам нужно положить какие-то бинарные данные во что-то, что поддерживает только ASCII-текст, используйте лучше base64.
https://go.dev/play/p/NPrAMrsHZje
package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	srcString := "Привет, тут есть юникод"
	fmt.Println("Исходный текст:", srcString)

	codedStr := base64.StdEncoding.EncodeToString([]byte(srcString))
	fmt.Println("После кодирования:", string(codedStr))

	resBytes, err := base64.StdEncoding.DecodeString(codedStr)
	if err != nil {
		fmt.Println("Ошибка декодирования:", err)
		return
	}
	resString := string(resBytes)
	fmt.Println("После декодирования обратно:", resString)
}
Ничего удивительного.
В документации указано что делает %x в Sprintf.

Если нужно убедиться в корректности в строке, то использовать strings.ToValidUTF8.