When you declare a variable you can assign an initial value to it in the same statement:
DECLARE @currency_date smalldatetime = getdate()
Later, you can assign other values to that variable. It is a variable, it means its value may change as the program executes.
The code you posted does the following:
Allocate memory for storing @currency_date
Assign current date and time (now) to @currency_date
For each row in currency_history table whose currency_x_id is equals to 119:
assign the value of check_out_date column to @currency_date variable
So what value will contain @currency_date? Well, it depends.
If there are no rows in currency_history table with currency_x_id equals to 119, the value will be the current date and time.
If there is one row, the value will be the value of check_out_date column of that row.
If there are more rows, the value will be the last assigned value. But, which is the last one? Well, the query doesn't specify any order, SQL Server may scan the table in any order it "wants", the order is undefined, and the value assigned is not deterministic.
@currency_datewill update value withcheck_out_date