REVISED SOLUTION - Revision #1
You should Cast Varchar values as Integers so that they can be compared to integer literal values.
SET @vQuery = 'select dropout_count,NE_count from (select count(Child.cname) as dropout_count from ' + @ChildTblName + ' As Child WITH (NOLOCK) INNER JOIN ' + @FamilyTblName + ' AS Family WITH (NOLOCK) ON
Child.barcode=Family.barcode where Child.distt = ' + @DistrictID + ' and CAST(droupout as INT) between 01 and 23)a
CROSS JOIN (select count(Child.cname) as NE_count from ' + @ChildTblName + ' As Child WITH (NOLOCK) INNER JOIN ' + @FamilyTblName + ' AS Family WITH (NOLOCK) ON
Child.barcode=Family.barcode where Child.distt = ' + @DistrictID + ' and CAST(nereason as INT) BETWEEN 01 and 24)b'