People often misunderstand the purpose of CASE statement. You are using it as a control flow statement but rather it's a complex function which returns a value and you can then compare that value to something else. In your particular case I would write the condition without CASE entirely:
WHERE
...
AND (
@val = 3
OR (@val = 2 AND VoucherHead.VoucherStatus='false')
OR (@val = 1 AND VoucherHead.VoucherStatus='true')
)