Ok i think you are confusing the terms, formats, values etc. which makes you worry about things you shouldn't really worry about.
To be able to understand what i am trying to explain, you need some understanding of how the checkboxes work. So:
Yes that is true. But in the server action, you get your checkbox value (it.s $_POST.variable) in server connect after the form is submitted. Due to the nature of checkboxes and how they function (read more here) If a checkbox is unchecked when the form is submitted, there is no value submitted to the server.
When there is no value submitted to the server your database field will get an empty string. As many other users you don't want an empty string, so you use the .default(0) to add 0 to your database field, when the checkbox is not checked.
If it's checked, on form submit it will pass its value.
This is not the same on the front end. You don't have a submit event and you don't work with $_POST variables there. On the front end, you access the value of the input, and the value of your checkbox is always what you set in the value="" attribute. It does not change when the checkbox is checked or not. You can always inspect all of this, by using dmx.app.data in the console and accessing the attributes and their values for any element.
The checked attribute, however changes on the fly, once its state changes. So it returns true or false - as you already noticed.
Not sure what database field are you using to store your is_deleted value, but if it's a TINYINT(1) (as this is what people usually use for boolean values in mysql) it accepts 0 and 1 as values for false/true.
Because - check the explanation about tinyint above.
So i continue to NOT see any issue that your database returns 0 and the checked attribute on the page returns false and i don't why are you worried..
Why would you make your life harder and your code more complicated by doing:
f_contact.i_contact_is_a_test.checked ? 1 : 0
when you can just store:
f_contact.i_contact_is_a_test.checked