If you use state based input, then you only are ever going to be able to process information available at exactly the time you run your logic iteration. This means if something happens between iterations, you will miss input.
With events, you can examine the timestamp and know exactly when something happened. You can know whether or not a key was actually held down during the entire time between iterations. But often that is irrelevant in terms of keyboard input. In many cases, you'll find that people do something like:
case ALLEGRO_EVENT_KEY_DOWN:
if (event.keyboard.keycode == ALLEGRO_KEY_LEFT)
input.left = true;
break;
case ALLEGRO_EVENT_KEY_UP:
if (event.keyboard.keycode == ALLEGRO_KEY_LEFT)
input.left = false;
break;
This gives you state based input, but you can mix it in with other event code such that you don't have two different ways to process data.
So basically, events are mandatory if you do not want to miss any input or if you need to know the "precise" time something occurred. Otherwise, state based is sufficient.