In the BlockStateTag tag all the values that must be Boolean are strings, which does not make sense since it only has 2 possibilities, true or false
For example
/give @p stone_slab{BlockStateTag:{waterlogged:"true"}}
should be
/give @p stone_slab{BlockStateTag:{waterlogged:true}}
or
/give @p stone_slab{BlockStateTag:{waterlogged:1b}}
Values that use the BlockStateTag tag and should be Boolean are:
open, occupied, powered, lit, has_bottle_0, has_bottle_1, has_bottle_2, drag, signal_fire, waterlogged, down, east, north, south, up, west, conditional, inverted, triggered, eye, in_wall, snowy, enabled, hanging, persistent, has_book, extended, short, locked, bottom, unstable, attached, disarmed
This is not just booleans, integer states are also stored as string