Do you understand that with your original program, <itab1> and <itab2> are the same object?
CREATE DATA w_dref TYPE TABLE OF (w_tabname). "
This sets aside an area of memory that can hold a table of type (w_tabname).
ASSIGN w_dref->* TO <ITAB1>.
This points <itab1> to that area of memory
ASSIGN w_dref->* TO <ITAB2>.
This points <itab2> to the same area of memory.
Therefore it is not possible to <itab1> to have anything different from <itab2>.
If you implement what Ashish Rawat said properly, it will work.
DATA W_REF2 type ref to data.
CREATE DATA w_dref2 TYPE TABLE OF (w_tabname).
ASSIGN w_ref2->* TO <ITAB2>.