You can use a combination of DeleteCases and ReplaceAll to accomplish this for your particular example:
DeleteCases[ ReplaceAll[ data = <|a -> tr, b -> <| c<|c -> <| d<|d -> 12, e -> del, f -> <|h -> true, i -> false|>|>|>|>,false|>|>|>|>; DeleteCases[ ReplaceAll[data, {true -> True, false -> False}], del, Infinity] <|a -> tr, b -> <|c -> <|d -> 12, f -> <|h -> True, i -> False|>|>|>|>
The Infinity, the last argument of DeleteCases, specifies that the deletion should occur at every level (and not just on the outer association). When you use DeleteCases on an association, it matches on the values of the association, so simply matching on del is sufficient in this case.
Note that if you explicitly want to check for a value being the same (=== or SameQ) as del, then you would want to replace the argument del to DeleteCases above with something like val_ /; val === del.