Solved myself ( But I am open if any of you know a better solution )
I succeeded to apply second approach above, it is not possible to cast nested but it is possible to call view while creating another view, to have gdatu as numeric field and subtract from 9999999 to get real date then converting back again to date field. I did it creating 3 CDS views.
View 1 ( Aim is to change gdatu to numc type )
All fields are selected from tcurr and gdatu is converted to numc with below statement
cast(tcurr.gdatu as abap.numc(8)) as fnumc
View 2 ( Aim is getting integer value for current date by changing fnumc field and subtracting it from 9999999 )
All fields are selected from view1 and fnumc is changed to int4 and subtracted from 99999999 and we have real date as integer
99999999 - cast(fnumc as abap.int4( 10 ) ) as fdate
View3 ( Aim is to have proper date field instead of fdate which is in int4 type )
All fields are selected from view 2 and First eight character of value fdate is taken using substring function then used cast to have proper date type.
cast( substring( cast(fdate as abap.char(11) ) , 1 , 8 ) as abap.dats ) as crdate
Now I am able to get currency for required date and don't need to use CONVERT_CURRENCY function and it is much much faster (5 minutes to 3 seconds ) than using CONVERT_CURRENCY cds function.
inner join zxxbw_ddl_tcurr on crdate = bkpf.bldat and
zigbw_ddl_tcurr.kurst = 'M' and
zigbw_ddl_tcurr.fcurr = 'USD' and
zigbw_ddl_tcurr.tcurr = 'EUR'