This formula snippet

            ISBLANK(
                TEXT([Contact].Request_Portal_User_Account__c == True)
                )

is never going to evaluate to `true`. The text value of that Boolean expression would always be a non-blank string (`"True"` or `"False"`), if this even compiles.

Remember that the `NOT()` function takes a Boolean, and Checkbox fields are Booleans. You can pass one to the `NOT()` function directly.

If we make those substitutions, remove some of your extra parentheses, and add a comma (I don't believe your formula as written will compile), you come out with

    AND(
        NOT($Setup.Hierarchy_Settings__c.Skip_Process_Builder__c), 
        [Contact].RecordType.DeveloperName == $Label.Contact_Record_Type,  
        OR(
            AND(
                ISNEW(),
                NOT([Contact].Request_Portal_User_Account__c)
            ),
            AND(
                ISCHANGED([Contact].Request_Portal_User_Account__c),
                NOT([Contact].Request_Portal_User_Account__c)
            )
        )
    )

That's going to be true if the first two conditions are true, and `Request_Portal_User_Account__c` is `false` on a new record or is changed to `false` on an existing record.