Oracle uses cursors under the hood for the update and for selects, which is going a bit beyond what you're asking. But no, you don't have to select the rows to be updated in a visible explicit or implicit cursor.
You don't even have to use a cursor to select the row though. you can do a select ... into:
CREATE ... AS
my_row my_table%rowtype;
BEGIN
select * into my_row from my_table where my_id = id;
-- do something with the row data
dbms_output.put_line(my_row.my_col);
END;
Or you can select individual columns into separate variables instead of into a rowtype variable. But you have to get exactly one row (or one row's worth of columns) from the query; if there are no matches you'll get a no data found error, if more than one then too many rows. You can also select multiple rows into a PL/SQL table and manipulate the data there, still without a visible cursor.
However, if you want to select and update the row, you probably do want a cursor with a select ... for update clause, and then update ... where current of ... to prevent someone else modifying the data between the select and the update.
A simple update as you've got it now will be the most efficient way, whether you're updating one row or millions.