In addition to being simpler, the second way will also perform much better:
AdWords scripts will not have to unnecessarily read in all the campaigns
and ad groups. Additionally, it's quicker to read 10,000 ads once than it is
to execute 50 reads of 200 ads each.

Batch changes

Whenever possible, AdWords scripts attempt to batch up the changes to
campaign data. It is much quicker to execute a single 1000-keyword change
than it is to execute 1,000 separate changes. Consider this example:

keyword.setBid(1.25);

AdWords scripts treats this code as "change was requested;
add it to the current batch of changes". The bid change is not
immediately carried out.

Now suppose you execute

keyword.getBid();

At this point, AdWords scripts will make sure the keyword data it provides
is up-to-date; if there are any outstanding changes, they will now be
carried out. The above line of code will indeed change the value of the
keyword bid.

Reports vs Selectors

Unlike regular selectors, Reports
provide access to more data. For large queries, reports will often perform better,
and they will not hit the normal fetching quotas.
To modify the underlying entities, you will still need selectors. In summary,

With reports, it takes a single call to download the report, complete with both attribute
fields (such as KeywordText) and metrics (such as clicks, impressions, etc.). If you
exclude segment fields (such as Date) and don't provide any conditions, you will get back
one record for each entity (i.e. keyword in KEYWORDS_PERFORMANCE_REPORT). This
lets you iterate over far more keywords than you normally could using regular selectors.