In your first example, the value (as is returned by the alert expression) is in GB, where G stands for "giga" (i.e. 10^9) and B stands for bytes. What
humanize does is convert a value that may be a few orders of magnitude above or below what a human can comfortably parse into a human readable value with a metric prefix appended. E.g. it would likely produce 1.234G for an input of 1234567890 and 23n for 0.000000023. Now it's your responsibility to append the unit to that, whether it's B (for bytes), m (for meters) or s (for seconds). The output would then look like 1.234GB or 23ns.
The issue with your first example is that you're already starting with a non-standard unit (GB instead of B), so in the best case what you'll end up with is 551.6mGB (milli-gigabytes) which is not very useful. If you insist on using humanize, then you have to change your alert expression to
expr: wmi_logical_disk_free_bytes{volume !~"HarddiskVolume.+"} < 3 * 1e9
and your description to
description: "{{ $labels.instance }} volume {{ $labels.volume }} has {{ $value | humanize -}}B available storage"
The issue with your second example is that you shouldn't use metric prefixes to begin with. There is no milli-percent or giga-percent, so you should simply output the value (maybe with a printf "%.2f" $value to limit the decimals).
Cheers,
Alin.