So you are suggesting this:
<element name="myOVC" type="xs:int" dfdl:outputValueCalc="{ ../myIVC + 3 }" />
<element name="myIVC" type="xs:int" dfdl:inputValueCalc="{ compute here }" default="0"/><!-- default only used when unparsing -->
That's not unreasonable.
Question: Can the behavior you need be represented by way of a test for existence of the IVC element?
<element name="myOVC" type="xs:int" dfdl:outputValueCalc="{ if (fn:not(fn:exists(../myIVC))) then 0 else ....do the real computation here.... }"/>
<!-- an optional IVC element -->
<choice>
<sequence> <!-- IVC can't be root of a choice branch so workaround -->
<element name="myIVC" dfdl:inputValueCalc="{ compute here }"/>
</sequence>
<sequence/> <!-- nothing at all is the other alternative -->
</choice>
That's clumsier, but does achieve, I think, the same behavior without depending on defaulting. It does depend on fn:exists and fn:not functions.