A solução é bem simples: você deve escapar dos $ signs das funções addprefix ():
define GEN_OBJS =
$(1)_srcs := a.c b.c
$(1)_gen_objs := $$(addprefix objdir/,$$($(1)_srcs:.c=.o))
$(1)_man_objs := $$(addprefix objdir/,$(foo_man_srcs:.c=.o))
endef
Mas é mais importante entender como você pode depurar esse tipo de problema sozinho. Basicamente, você apenas tem que substituir "eval" por "info", e make irá imprimir a entrada de eval ao invés de analisá-lo.
No seu exemplo, substituindo "eval" por "info" e, em seguida, chamando make yields:
foo_srcs := a.c b.c
foo_gen_objs := objdir/$(foo_srcs:.c=.o)
foo_man_objs := objdir/a.o objdir/b.o
Como você pode ver, call () expandiu as funções addprefix () antes de eval () ser chamado. Se você corrigir seu makefile como escrevi acima, você verá:
foo_srcs := a.c b.c
foo_gen_objs := $(addprefix objdir/,$(foo_srcs:.c=.o))
foo_man_objs := $(addprefix objdir/,a.o b.o)