sync.Mutex из другой горутины (не из той, где был Lock)?Да, можно. sync.Mutex не привязан к горутине (в отличие от рекурсивных мьютексов в Java/C#). Любая горутина может вызвать Unlock(). Но так делать не рекомендуется - усложняет рассуждения о коде.
Повторный Lock() в той же горутине без предварительного Unlock() приведёт к deadlock - мьютекс не рекурсивный.
var mu sync.Mutex
mu.Lock()
mu.Lock() // deadlock: та же горутина ждёт сама себя