Internally, how data is passed using COMMAREA depends on whether you call your program using LINK or XCTL.
If you use LINK, then the COMMAREA is passed by reference, i.e. the address of the variable mentioned in COMMAREA(WS-XXX) is passed.
If you use XCTL, then the COMMAREA is passed by content, i.e. the entire COMMAREA is copied into a different storage area within CICS and this address is assigned to the COMMAREA in the called program. This is why LENGTH is a compulsary field when using COMMAREA with XCTL (as CICS needs to know how much data it should copy).
This is to explain how COMMAREA works.
About your question regarding redefines. There is no restriction about redefines because ultimately all CICS does is passes the address (if LINK is used) or copies the entire data content (if XCTL) is used.
If you are using XCTL and the data is not available in the called program, check if the data was available in the calling program in the first place. If it is, then check the LENGTH value you are using.
If you are using LINK, again check if the data was present in the calling program first. If it is, then there is no way that it is not available in the second program because both programs reference the same data area.