select EmployeeID, CTC, PD, EffectedFrom,
dbo.GetLastEffectedToDate(employeeID, effectedFrom) as EffectedTo
where blah blah blah
The UDF (user defined function) you'd need to create "GetLastEffectedToDate" would take the employeeID and that row's effectedFrom date and run a query to find the next record that met your criteria that had an EffectedFrom date greater than the parameter date passed in. Otherwise, return null.
Another option would be to use a TABLE variable in your stored procedure. Load all of the results into by in order by employeeid and your date columns. Then iterate through the TABLE variable and update various columns based on the last record iterated.
https://www.nullskull.com/a/705/sql-server-table-variables-to-eliminate-cursors.aspx