Is the update / subselect query as simple as you show in the example, or is it more complex? If it's complex, it might improve things at least to the point of usability to create a temporary table, e.g.:
create temp table xyzzy as select foo as id, bar as name from <complex query>;
update table_a set name = (select name from xyzzy where table_a.id = xyzzy.id);
drop table xyzzy;
Alternately, it looks like with some proper trickery, insert or replace may be able to do what you want: http://www.mail-archive.com/sqlite-users@sqlite.org/msg27207.html. Consider this example:
create table foo (id integer primary key, name text not null, extra text not null);
create table bar (id integer primary key, name text not null);
insert into foo values (1, "one", "first");
insert into foo values (2, "twox", "second");
insert into bar values (2, "two");
insert or replace into foo (id, name, extra)
select bar.id, bar.name, foo.extra
from bar left join foo on bar.id = foo.id;