If you're going to do a lot of appending, might I suggest a ListBuffer or a Vector?
TraversableLike, and FilterMonadic will both size up the resulting return value based upon the length of what's passed to it. You'll get a List of N items, and the call to flatMap will also traverse the list to remove/flatten the Options. Items will then get dropped in the List. You're looking at one or two collectable objects every time you run through that method, as opposed to bin.items.length collectable objects in your original code.
Look at it this way-- what happens if bin.items is a List() of 10M objects? completed_items can be replaced up to 10M times. The .flatMap creates one collection of 10M length, removes the None objects, and returns the resulting List.
def complete_items(completed_binindex: Int, bin: ItemBin, nonterminal: Nonterminal, value: Value): MoreItems = {
for {
(item, v) <- bin.items
_ <- expectedSymbol(item)
nextValue <- grammar.nextValue(document, item.origin, bin.binindex, completed_binindex,
nonterminal,item.ruleindex, item.dot, v, value)
} yield {
item.inc -> nextvalue
}