Why is a trigger preventing update?
I would recommend using this trigger template where possible.  change it to suit your needs, of course.
It uses an IF UPDATE(column) to short circuit if the DML doesn't reference the column the trigger cares about.  It also uses the EXCEPT clause for what I've found the fastest way to compare the INSERTED and DELETED tables.  Just add more columns to the lists to get more comparisons without needing to worry about NULL/not null values.
Just adding an IF UPDATE block would solve your issue immediately with the least change to the trigger logic.
As for why your statement hung; the INSERTED and DELETED triggers are heaps without indexes.  This makes joining them on the primary key an expensive operation, much less the comparison of the relevant column.  You can make it as fast as possible (as the below has done) but your best bet to avoid it seemingly hanging would be to batch your statements.  Do 5,000 rows at a time to avoid unnecessarily large strain on your tempdb.
A random additional note; we have gone a few steps further, we don't have audit triggers like this, but we use INSTEAD OF INSERT/DELETE to enforce the use of soft-delete in our application.  However, when we do need to hard delete records, we have another short circuit that checks context info for a special binary value, then just doesn't fire off for that value.  You could implement something like that as well.  Leave the trigger in place for the application, but special statements like huge table maintenance could just issue the proper context info and the trigger would ignore the statement.  You would then need to handle the logic for what the trigger was supposed to do on your own, but triggers are brute force.
ALTER TRIGGER trgMyTriggerName ON dbo.MyTableName 
AFTER UPDATE
AS
BEGIN

    /** Inside triggers, UPDATE(column) checks to make sure that the update statement 
        actually referenced the column.  NOTE that this does not mean the value actually 
        changed, just that the update (or whatever DML) statement referenced the column.

        If you use an ORM like entity framework then the whole row gets updated all the time
        anyways, regardless of if the value changed.  still, this is a good short circuit to
        prevent unnecessary logic from being executed.
        **/
    IF UPDATE(MyAuditColumn)
    BEGIN

        ;WITH CTE_Changed AS
            (
            SELECT I.PrimaryKeyID, I.AuditColumn
            FROM INSERTED AS I
            EXCEPT
            SELECT D.PrimaryKeyID, D.AuditColumn
            FROM DELETED AS D
            )
        INSERT INTO audit.MyTableName
            (transaction_type, transaction_user, primaryKeyId, someColumn)
        SELECT 'U', SYSTEM_USER, C.PrimaryKeyID, C.AuditColumn
        FROM CTE_Changed AS C

    END



END